BOM引起的PHP输出

风行水上 @ 2014-01-27 10:23:06
标签:

问题

一个PHP程序,其中的header语句不起作用

header("Location: login.php");

原因

打开error_reporting(E_ALL),报错header之前已有数据送出。

Warning: Cannot modify header information - headers already sent by ...

调试的结果居然是由于文件的BOM(Byte Order Mark)引起的。

PHP源程序文件用的是UTF-8编码,UTF-8编码对应的BOM是EF BB BF

通过Fiddler观察到的结果是响应数据的开头有三组EF BB BF

修正

用Vim打开文件,:set nobom后,重新保存,问题解决。

延伸

如何找出所有包含BOM的文件并进行修正呢?

以UTF-8文件的BOM为例,

#!/bin/bash

fgrep -rl -I $'\xEF\xBB\xBF' $dir  ;# find UTF-8 BOM

"-r"指定递归搜索,"-l"指定只列出文件名,"-I"指定忽略binary文件。

需要说明的是上面的命令只对Bash Shell有用,C Shell下则有问题(不能识别转义字符)。

可以借助sed去掉BOM标记。

fgrep -rl -I $'\xEF\xBB\xBF' . | xargs sed -i 's/^\xEF\xBB\xBF//;q'

只是去掉文件开头的三个字符也可以用tail命令。

tail --bytes=+4 $file
标签:

分享到:
comments powered by Disqus

21/22ms