有时候在编写网页的时候,网页的头部会莫名其妙的出现一行空行,但是在文件里面并没有任何的字符。用 PHP 生成验证码,在本地测试都没有问题,传到服务器上面图片却是一个红色 X,其实这些多半都是文件 BOM 在作怪,几天就给大家分享一下,什么是文件的 BOM 头,PHP 如何批量去除 BOM 头的方法。
类似 WINDOWS 自带的记事本等软件,在保存一个以 UTF-8 编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以 UTF-8 编码。对于一般的文件,这样并不会产生什么麻烦,但是对于网页文件来说,就不能识别 BOM 头,比如 PHP 文件如果包含 BOM 头字符,运行时候将会报错。
PHP 并不会忽略 BOM,所以在读取、包含或者引用这些文件时,会把 BOM 作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 Top Padding 设置为 0,也无法让整个网页紧贴浏览器顶部,因为在 HTML 一开头有这3个字符。
Windows 编辑器如果保存为 Utf8 文件就会帮你加上BOM头,以告诉其他编辑器以 Utf8 来显示字符,现在已经有很多软件识别 BOM 头。
但是在网页上并不需要添加 BOM 头识别,因为网页上可以使用 header 头指定 charset=utf8 告诉浏览器用 utf8 来解释。
去掉 BOM 头的办法,最简单就是使用 editplus 或 ultraedit 等软件来操作,但是如果文件很多的话,而你又是使用的 PHP 作为开发语言,下面的这个方法可能比较适合你。
编辑器调整为 UTF8 编码格式后,保存的文件前面会多出一串隐藏的字符(也即是BOM),用于编辑器识别这个文件是否是以 UTF8 编码。
运行 Editplus,点击工具,选择首选项,选中文件,UTF-8 标识选择总是删除签名,然后对 PHP 文件编辑和保存后的 PHP 文件就是不带 BOM 的了。
打开文件后,另存为选项的编码格式里选择(UTF-8 无 BOM 头),确定就 OK 了。
使用 Notepad++ 打开需要去除 BOM 头的文件,在菜单栏找到格式,点击 转化为 Utf-8 无 BOM 编码格式,然后保存文件即可。
PHP 中有专门去除这类字符的函数,不过这个无法遍历子文件夹,只针对当前文件夹里面的文件,可以去除 JS、CSS、HTML、PHP 和 TXT 文件里面的 BOM 头字符。
/*清除rom*/
if(isset($_GET['dir'])){
$basedir=$_GET['dir'];
}else{
$basedir = '.';
}
$auto = 1;
checkdir($basedir);
function checkdir($basedir){
if($dh = opendir($basedir)){
while(($file = readdir($dh)) !== false){
if($file != '.' && $file != '..'){
if(!is_dir($basedir."/".$file)){
echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>";
}else{
$dirname = $basedir."/".$file;
checkdir($dirname);
}
}
}//end while
closedir($dh);
}//end if($dh
}//end function
function checkBOM($filename){
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if(ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191){
if($auto == 1){
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return "<font color=red>BOM found, automatically removed.</font>";
}else{
return ("<font color=red>BOM found.</font>");
}
}
else return ("BOM Not Found.");
}//end function
function rewrite($filename, $data){
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
使用方法
将上面的代码保存一个临时文件,比如 remove-bom.php,然后上传到服务器,然后通过网址访问这个文件即可。