有没有遇到过这样一种情况?php里include文件,无论怎样修改前台显示时在页面中调用内容的地方始终会多出一条缝隙或者空格,使得整个页面版式异常。通常我们会一个个地去排除html结构和css样式的原因,但这不是什么默认行距、字节占位的问题,即便css的hack如此之多,但这其实真不是由它造成的,所以最后只能是做无用功。
如果将include的内容直接复制到当前页中,或者将include文件编码由utf-8换回gb2312会惊奇地发现此时问题不复存在,由此便会自然联想到,曾经在.net里为了页面不乱码而在进行utf-8编码时必须包含的那个BOM头。于是去掉,才发现果然如此。原来php是不认这个BOM头的,所以才会把它当作字符像空格一样地给渲染了。
那么,什么是BOM呢?
BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是“FF FE”,变成UTF-8就成了“EF BB BF”。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8的编码。微软做这种检测,但有些软件或语言不做这种检测,而把它当作正常字符处理。也因为这是微软暗自所作的标记,所以.net里include文件时必须包含,不然就可能导致页面乱码。而到了php里include文件时,它就成了画蛇添足,一颗耗子屎搅了一锅汤。
解决的办法很简单,比如:
1、用UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件开头是否含有“EF BB BF”;
2、用Dreamweaver打开,察看页面属性/编码,看“包括Unicode签名BOM”前面是否有被勾选;
3、用Windows的记事本打开,选择“另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM……
总之是,去掉这个BOM头即可。
![[《东京奏鸣曲》海报]](http://ichov.com/wp-content/uploads/2011/11/tokyo_sonata.jpg)


