1. 程式人生 > >PHP去除BOM頭

PHP去除BOM頭

BOM認知

BOM(Byte Order Mark),位元組順序標記,,出現在文字檔案頭部,Unicode編碼標準中用於標識檔案是採用哪種格式的編碼。編碼是\xEF\xBB\xBF,BOM頭是UTF-8來告訴編輯器:這是UTF8編碼。

PHP和BOM

PHP在設計之初並沒有考慮到BOM頭的問題,所以在編解碼的時候很容易出現問題,比如以下問題,json_decode,當解碼的string有BOM頭的時候json_decode就解析失敗,返回NULL。然而這並不是我們想要的結果。

去除BOM的辦法

1、直接嵌入到程式碼中:

//關於\xEF\xBB\xBF,看第一點BOM認知
$result = trim($result, "\xEF\xBB\xBF"); print_r(json_decode($result, true)); exit;

2、寫一個去除BOM的PHP檔案:

此方法優點:簡單,出現BOM,呼叫一次檔案就OK了

將以下程式碼寫到一個php檔案中,如:bom.php 放置在你的專案中
呼叫一次就可以去除專案檔案中的BOM,程式碼如下:
//remove the utf-8 boms   

if (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); } ?>