php的bom

BOM——Byte Order Mark,就是字节序标记。在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。   
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。

PHP对BOM是不会进行特别处理,只会被原原本本输出的,这就造成比如header之类的函数会报warning–”header has already sent”,session cookie 失效,页面却是一片空白或者在页顶处有一行空白导致页面乱套等各种莫名问题。

因此需要对代码库中的检查并替换bom标记,避免系统不出现异常

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) {
			$rest=substr($contents, 3);
			file_put_contents($filename,$rest);
			echo 'WITHBOM,REMOVED';
	}
	else
	{
		echo 'WITHOUT BOM';
	}
}
转载请注明来源:Leoncom-《php的bom》
Trackback

no comment untill now

Add your comment now