BOM头的处理

类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于 PHP来说,BOM是个大麻烦,尤其是在用PHP做接口输出的时候。

PHP并不会忽略BOM,在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分,一并输出出去。所以,在调用带有BOM的接口的时候,时常会遇到报文无法正确解析,但是看上去,报文又没有任何问题。

所以,在用PHP做接口被调用方时,一定要避免出现BOM头,这样给大家带来的麻烦都会减少,如果是在调用对方接口时候,对方接口存在BOM头,无法让对方去掉的时候,我们就要自己去手动去掉BOM。

附上一段代码,去判断是否存在BOM,并且去掉。

function checkBOM($filename) {
$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)         {
$contents = substr($contents, 3);
}
return $contents;
}