引用 | 編輯
Qoo
2007-02-26 09:31 |
樓主
|
||
x0
什麼是 BOM (Byte-Order Mark)?-------------------- 在一些平台上,是把代表數值較大的 byte 放在前面,這稱為 Big Endian (BE) 的系統;有些平台則相反,是把代表數值較小的 byte 放在前面,稱為 Little Endian (LE) 的系統。 若採 LE 方式編碼,BOM 會表示為 0xFF 0xFE,而在 Unicode 的定義中是不存在 U+FFFE 這個字元的. 若採 BE 方式編碼,BOM 會表示為 0xFE 0xFF,而 U+FEFF 剛好是在 Unicode 中的有效字元,代表的是一個不佔空間的 space 符號,所以即使沒被解釋為 BOM,也不會對閱覽者產生錯誤的訊息. -------------------- 如何移除? (使用 PHP) 引用 http://www.bo-blog.com/index.php?job=art&articleid=a_20040805_214712 ------------------- BOM信息是文件開頭的一串隱藏的字符,用於讓某些編輯器識別這是個UTF-8編碼的文件。但PHP在讀取文件時會把這些字符讀出,從而形成了文件開頭含有一些無法識別的字符的問題。 要檢測一個UTF-8文件是否含有BOM信息,就是檢測文件開頭的字三個符,是否為0xEF, 0xBB, 0xBF。 下方有個小程式,使用者可以搜尋某個目錄下所有文件,並檢測是否加了BOM。 本文轉載自 http://www.hoyo.idv.tw/hoyoweb/document/view.php?sid=13&author=hoyo&status=view 複製程式 //此文件用於快速測試UTF8編碼的文件是不是加了BOM,並可自動移除 //By Bob Shen $basedir="."; //修改此行為需要檢測的目錄,點表示當前目錄 $auto=1; //是否自動移除發現的BOM信息。1為是,0為否。 //以下不用改动 if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if ($file!='.' && $file!='..' && !is_dir($basedir."/".$file)) echo "filename: $file ".checkBOM("$basedir/$file")." "; } 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 ("BOM found, automatically removed."); } else { return ("BOM found."); } } else return ("BOM Not Found."); } function rewrite ($filename, $data) { $filenum=fopen($filename,"w"); flock($filenum,LOCK_EX); fwrite($filenum,$data); fclose($filenum); } ?> x0
|