php在UTF8空文件也可以输出奇怪的字符?

标题长了点,但可以引出我们今天的问题。咳咳。

有的时候在调PHP的时候,发现明明文件是空的,却告诉你header has been sent。那说明已经有字符输出了?不过在session_start()之前明明已经没有东西了?点解?
找了一下,是UTF-8文件的BOM(Bytes Of Mark)在作祟。

What is BOM?在神奇的CSDN找到以下东东。

在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来标记文本文件的编码方式的。

也就是说,如果UTF-8编码的PHP程序,看到有开头时候说的那些现象,那就应该是这个文件头部有着EFBBBF这三个字节的输出。不过这几个字符是看不到滴,怎么删呢?

  1. 使用Dreamweaver2004打开一个utf8编码的文件,按Ctrl+J,可以看到一个BOM的checkbox选项,去掉它。 
  2. BOM占了文件的前三个字节,普通的文本编辑器是看不到的,用winhex打开可以看到前3个字节的bom标记。   

编辑器在保存的时候默认是添加BOM的,有些则不是。 win2k下的记事本默认是添加的。如果用EditPlus的话,在参数->文件里可以看到有关UTF-8文件的保存选项,也有可能汉化为“签名”的。选“总是删除”就OK了。UltraEdit在另存的时候也有这样的选项。

Copyright © 2007. All Rights Reserved.

发表评论

电子邮件地址不会被公开。 必填项已用*标注