7

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

 3 years ago
source link: https://laotan.net/remove-php-bom/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
BOM

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

tds

5 Jun 2010 • 2 min read

最近帮忙搞一个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 记事本吧


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK