霜天部落 | 关注LAMP高性能、高并发架构的设计与研究

检测UTF8编码的文件中是否有BOM及删除BOM

UTF8以字节为编码单元,没有字节序的问题。UTF16以两个字节为编码单元,在解释一个UTF16文本前,首先要弄清楚每个编码单元的字节序。Unicode规范中推荐的标记字节顺序的方法是BOM。BOM是Byte Order Mark的缩写。UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

在使用了记事本工具编辑UTF8编码文件保存后,它会自动加上一个 BOM,这三个字节的头部信息会造成页面出现乱码,用户不能正常登录或购物车不能保存等问题,所以需要您对含有BOM的文件进行处理。以下代码可以删除BOM 头:

";
}
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);
}