1. 什么是BOM
BOM全称为Byte Order Mark,是一个位于文件头部的不可见字符,用于指示一个文本文件的字符编码方式。
1.1 UTF-8编码的BOM
UTF-8编码实际上在表现形式上不需要BOM,因为UTF-8的字节序是不重要的。但有时候仍然会出现UTF-8带BOM的情况,这主要是由于一些操作系统或编辑器的缺陷导致的。在UTF-8编码中,BOM有以下三种形式:
0xEF, 0xBB, 0xBF // UTF-8 with BOM
2. BOM的问题
虽然BOM为文件编码方案提供了标识,但也带来了一些问题,如:
2.1 文件格式判断失败
某些文本编辑器没有正确地处理BOM,导致判断文件格式出错。例如,PHP代码在调用file_get_contents()函数读取某个UTF-8编码的文件时,如果该文件带有BOM,则会导致判断文件格式为binary。
2.2 输出HTML页面时出现乱码
在PHP中使用header()函数指定输出的Content-Type为text/html时,如果页面中包含BOM,则会导致输出乱码。
3. PHP去除BOM的方法
3.1 使用substr()函数去除BOM
可以通过使用substr()函数来删除字串前三个字符(即BOM)。
function removeBOM($str="") {
if(substr($str, 0, 3) == pack("CCC", 0xEF, 0xBB, 0xBF)) {
$str = substr($str, 3);
}
return $str;
}
3.2 使用preg_replace()函数去除BOM
使用preg_replace()函数可以匹配字串开头的BOM,并将其替换掉。
function removeBOM($str="") {
$str = preg_replace('/\x{EF\xBB\xBF}/', '', $str);
return $str;
}
3.3 使用iconv()函数去除BOM
iconv()函数可以将BOM转换为空字符串,从而去除BOM。
function removeBOM($str="") {
return iconv("UTF-8", "UTF-8//IGNORE", $str);
}