PHP去除BOM頭
阿新 • • 發佈:2018-11-29
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);
}
?>