一、什么是BOM
BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。
二、概念:
- 在
UCS 编码
中有一个叫做"ZERO WIDTH NO-BREAK SPACE
"的字符,它的编码是FEFF
。而FFFE
在UCS
中是不存在的字符,所以不应该出现在实际传输中。 - UCS规范建议我们在传输字节流前,先传输 字符"
ZERO WIDTH NO-BREAK SPACE
"。 - 如果接收者收到
FEFF
,就表明这个字节流是大字节序的;如果收到FFFE
,就表明这个字节流是小字节序的。因此字符"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编码
了。
四、对php的影响
- PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符。
- 受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),也就是说,凡是不能够在执行之前进行输出的代码都将无效
五、解决方法
在 IDE 编辑器保存时把文件保存为不带BOM的UTF-8
文件