php文件代码采用UTF-8编码的BOM问题

一个项目,代码编码均为utf-8编码,发现问题:在使用session的时候报错,错误如下:
-------------------------------------------------

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at ......

-------------------------------------------------

那么表示在session前头有输出了,可是前面看起来没有什么输出,后经搜索发现原因如下:


用记事本编辑后,保存为utf-8编码的代码文件最前面会有BOM信息,而BOM信息是文件开头的一串隐藏的字符,用于让某些编辑器识别这是个UTF-8编码的文件。

 

PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符(十六进制下查看是以EF BB BF开头)。

 

所以当用记事本或DW(DW编码为utf8)打开该文件时,前面什么都没有,看不到。

 

但是实际上有BOM信息输出,而php的session前面不允许有输出,所以报错。

 

又测试:

Zend Studio v5.5.1(编码为utf-8)打开该文件,会看到有个芝麻点,删除它,session能正常获取了(但记事本再打开,选‘另存为’,会发现编码是ANSI了);

Zend Studio v5.5.1(编码为default)打开该文件,会看到有个“锘�”,删除它,session也能正常获取了(同样的,记事本再打开,选‘另存为’,会发现编码是ANSI了);

 

 

 

【解决的办法】:

(1)如果只包含英文字符(或者说ASCII编码内的字符,即ANSI),就把文件存成ASCII码方式吧。用UE等编辑器的话,点文件->转换->UTF-8转ASCII,或者在另存为里选择ASCII编码。如果是DOS格式的行尾符,可以用记事本打开,点另存为,选ASCII编码。

 

(2)如果包含中文字符的话——————

A.直接用Zend Studio v5.5.1(编码为utf-8)打开该文件,删除前面的芝麻点,保存,OK。(我认为的最佳解决办法!)

B.可以用UltraEdit32的另存为功能,选择“UTF-8 无 BOM”即可。

值得注意的是:这个时候你再用记事本打开该文件,选择另存为,你会看到该文件的编码是“ANSI”!!!为什么?因为没有BOM信息了,记事本不认识它是UTF-8的了!(诡异的是:如果你的代码有中文注释,你用UltraEdit32的另存为功能,选择“UTF-8 无 BOM”,保存,再用记事本打开,选择另存为......你会发现该文件的编码是UTF-8了!!!)。这种情况没关系,跟多老外的程序源码的编码都是ANSI , 我建议使用UTF-8是考虑到通用性——非洲人民可用、亚洲人民可用、欧洲人民可用...全世界人民都可用。


 

你可能感兴趣的:(PHP)