PHP文件迁移到LINUX服务器,BOM在捣乱

最近帮忙搞一个php程序,因为小细节,所以从本地备份文件用记事本修改后传到服务器上面时,顶部出现几行Warning: Cannot modify header information – headers already sent by…,看提示应该是编码错误。重新修改覆盖几次问题仍没有解决。

股沟了一下,原来是utf-8文件格式的bom在捣乱,对于我这样的程序菜鸟来说也是长见识了。

文件以UTF-8编码保存时,有两种情情况:带Unicode签名(BOM)和不带Unicode签名。BOM信息是文件开头的一串隐藏的字符,用于让某些编辑器识别这是个UTF-8编码的文件。

类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM——Byte Order Mark)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。

但对于 PHP来说,PHP在设计时就没有考虑BOM的问题,不会忽略UTF-8编码的文件开头BOM的那三个字符,会把BOM作为该文件开头正文的一部分(老谭注:我的程序在自己windows服务器下识别php时忽略了BOM,所以没有报错)。由于必须在<?或者<?php后面的代码才会作为PHP代码执行,所以将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码。由于在html一开头有这3个字符的存在,即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部。由于受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在 COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效。一切依赖COOKIE、SESSION实现的功能全部无效。

在知道原因后,问题也立即解决了。用不会自动添加BOM的编辑器重新修改源文件即可,例如DW(需要设置“添加BOM”选项),Editplus等,以后甚用win 记事本吧

Show Comments