BOM问题 不容忽视
什么是Bom?
BOM,英文全程为Byte Order Mark,是用来标记Unicode编码的标准字符。如果一个文件中开始位置含有BOM字符,表明这是一个Unicode字符编码的文件。BOM的标记字符在UTF-8中是EF BB BF,而在UTF-16中是FE FF。
BOM能导致的麻烦:
但是,并不是所有的程序都要识别BOM标记,通常Windows下的Notepad记事本程序会去识别这个标记,但是像浏览器之类的程序,很多不会只是会把这几个字符当作正常字符处理。所以呢,在运用中,往往就会出现很多莫名奇怪的问题。比如,PHP网页中布局混乱,header错误提示,CSS无效等一系列问题。使用HttpWatch查看处理过程以及获得的数据,发现在正常数据输出之前有几个乱码。
而不知道BOM问题的人,很难从中发现出现这些问题的原因。因为,无论你怎么进行顺藤摸瓜的调试,甚至你将所有PHP都删除,他还是会出现这样的错误。
下面举个例子测试一下。使用笔记本写下如下代码:
<?php
setcookie(‘aa’, ‘aa’);
echo ‘Test BOM Output!’;
?>
然后点保存,编码处选择UTF-8

然后,我们在浏览器中运行这个PHP脚本。用HttpWatch可以看到以下情况:

能看得到,在Test Bom Output前面,有一串乱码,没错,那就是BOM。
可能有人会问了,既然你说的这个BOM如果不被识别的话,那一定会在开头输出字符,那么你的setcookie语句为什么还正常运行了呢?
对,这里setcookie确实正确运行了,不好意思,我用的是Apache,开启了GZip,也就是说PHP输出的所有字符都会在PHP运行完毕之前缓存起来,并没有实时输出,所以这里setcookie能够正常运行。如果你使用IIS或者一些没开启缓存数据流的WEB Server,那这里使用setcookie一定会报错的。
然后我们用WinHEX打开这个文件:

可以看到,在0-2位置的字符正是上面所说的EF BB BF。
BOM问题的解决:
如果你是Windows平台,你可以用记事本打开有问题的文件,保存的时候在编码选项中选择ANSI编码,保存后即可解决。
或者打开WinHEX之类的文件16进制编辑器,检查看头三个或两个字节是不是上述所说的符号,删之即可。