移除PHP中BOM的方法
Leave a Comment»
PHP...還真麻煩,尤其是在Win主機下
好兄弟友情支援的虛擬機器主機最近老出問題,仔細詢問了緣由,看來還是技術維護人員不到位造成,且伺服器是Win2003+IIS,不穩定之餘對PHP的支援也存在些微的問題.
不想去埋怨什麼,期待早點完成維護即可.
今天上午挺意外的探索服務器恢複,但我的Movie
Castle頁面顯示卻很奇怪...全屏,且上方多了一行小空行,測試瀏覽器為IE7.然後去Firefox下查看,發現頁面的Width正常,但上方的小空行依然存在-.-
我是善於Google的人,於是遇到不明白的先詢問這本百科全書. 得到的答案是主題PHP檔案編碼是UTF-8 with
bom造成的,至於這個bom是什麼,看下這個中文解釋吧.
在UCS 編碼中有一個叫做"ZERO WIDTH NO-BREAK
SPACE"的字元,它的編碼是FEFF。而FFFE在UCS中是不存在的字元,所以不應該出現在實際傳輸中。UCS規範建議我們在傳輸位元組流前,先傳輸 字元"ZERO
WIDTH NO-BREAK
SPACE"。這樣如果接收者收到FEFF,就表明這個位元組流是Big-Endian的;如果收到FFFE,就表明這個位元組流是Little-
Endian的。因此字元"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。
UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF
BB BF。所以如果接收者收到以EF BB BF開頭的位元組流,就知道這是UTF-8編碼了。
Windows就是使用BOM來標記文字檔的編碼方式的。
很顯然...我的小空行是因為這個bom而產生的.
找到問題後的就是解決問題.去WP群裡問了聲,得到了一些建議,但個人覺得CSS樣式之前在相同的環境下沒有一點問題,沒理由現在突然顯示不了!
還是先解決已知問題吧...Google告訴我了很多去除bom的方法,但操作上來講都有點煩,最後終於找到了個稱心如意滴~muhahaha
一個自動移除bom的小程式...備份後大膽的試用,果然問題立刻解決.
<?php//remove the utf-8 boms//by magicbug at gmail dot comif (isset($_GET['dir'])){ //config the basedir$basedir=$_GET['dir'];}else{$basedir = '.';} $auto = 1; checkdir($basedir);function checkdir($basedir){if ($dh = opendir($basedir)) {while (($file = readdir($dh)) !== false) {if ($file != '.' && $file != '..'){if (!is_dir($basedir."/".$file)) {echo "filename: $basedir/
$file ".checkBOM("$basedir/$file")." <br>";}else{$dirname = $basedir."/".
$file;checkdir($dirname);}}}closedir($dh);}}function checkBOM ($filename) {global $auto;$contents = file_get_contents($filename);$charset[1] = substr($contents, 0, 1);$charset[2] = substr($contents, 1, 1);$charset[3] = substr($contents, 2, 1);if (ord($charset[1]) == 239 && ord($charset[2]) == 187 &&
ord($charset[3]) == 191) {if ($auto == 1) {$rest = substr($contents, 3);rewrite ($filename, $rest);return ("<font color=red>BOM found,
automatically removed.</font>");} else {return ("<font color=red>BOM found.
</font>");}}else return ("BOM Not Found.");}function rewrite ($filename, $data) {$filenum = fopen($filename, "w");flock($filenum, LOCK_EX);fwrite($filenum, $data);fclose($filenum);}?>
步驟:
1.Copy代碼到txt文檔中,儲存成php尾碼的檔案,命名為111.php
2.將111.php放在網站根目錄下
3.開啟瀏覽器,執行http://root/111.php
4.一切困擾都解決鳥...空行沒了,CSS樣式也顯示正常了.
撰文留念之...用這個方法可遠比將php檔案一個個另存新檔utf-8 without bom方便呢!!!