PHP处理BOM标记的UTF-8文件导致的问题

本文来自Kevin Yang博客 作者:Kevin Yang

最近让客户那边的技术维护人员在网页中埋入Google 的统计代码,结果对方说修改页面之后页面DIV就出现错乱了,原先并排的三个DIV,现在右侧的被挤到下面去了,而且文字排版什么的也有问题。一把Google的代码给撤了,就立即恢复正常了。

我觉得挺不可思议的,因为使用Google Analytics代码都那么长时间了,而且光是研究它那段脚本就研究了很长时间了,我知道GA是不可能会对网页DOM对象的Style造成影响的。

我迅速访问对方给我的网址,发现在IE下确实有问题——Firefox没问题——我将其保存到本地,研究了半天都没能定位问题所在,但是发现一旦把文件打开之后随便修改再保存一下好像就没问题了。想了半天,联想以前自己弄wordpress系统的时候,php文件的编码问题是一个很容易出错的问题,会不会是文件编码的问题,我用notepad2看了一下,该文件的编码是带BOM标记的UTF-8。我尝试着把他改成不带BOM标记的UTF-8,然后发给那边的技术人员让其试验一下,结果成功了。

后来上网查了下资料,发现PHP对带有BOM标记的UTF-8文件支持并不好,它并不能识别文件开头的三个字节的BOM标记,而是把它当作普通字节流输出了,因而导致输出内容有问题,从而造成页面DIV异常。

下面是网上找到的一小段材料:

PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符。由于必须在<?或者<?php后面的代码才会作为PHP代码执行,所以这三个字符将会直接输出。如果插件的文件有这个问题,将会导致在后台页面里激活或者不激活插件后显示白屏,如果是模版文件有这个问题,将会导致这三个字符直接输出,造成页面上方有一个小空行。国外的英文插件和模版一般都是用的ASCII码的编码方式,不会有BOM,只有国内的插件和模版会由于作者的不知情造成问题。还有,大家修改模版的时候,由于输出页面使用UTF-8编码,那么修改模版的时候如果有加入中文字符的话,必须把文件转成UTF-8编码才能正常显示,这个时候如果所使用的编辑器自动加上了BOM的话,将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码。