使用 PHP 函数或者软件去除文件的 BOM 头字符

发布于 2018-10-18 19:30:11 字数 3102 浏览 2689 评论 0

有时候在编写网页的时候,网页的头部会莫名其妙的出现一行空行,但是在文件里面并没有任何的字符。用 PHP 生成验证码,在本地测试都没有问题,传到服务器上面图片却是一个红色 X,其实这些多半都是文件 BOM 在作怪,几天就给大家分享一下,什么是文件的 BOM 头,PHP 如何批量去除 BOM 头的方法。

什么是BOM头

类似 WINDOWS 自带的记事本等软件,在保存一个以 UTF-8 编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以 UTF-8 编码。对于一般的文件,这样并不会产生什么麻烦,但是对于网页文件来说,就不能识别 BOM 头,比如 PHP 文件如果包含 BOM 头字符,运行时候将会报错。

PHP

PHP 并不会忽略 BOM,所以在读取、包含或者引用这些文件时,会把 BOM 作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 Top Padding 设置为 0,也无法让整个网页紧贴浏览器顶部,因为在 HTML 一开头有这3个字符。

其他软件

Windows 编辑器如果保存为 Utf8 文件就会帮你加上BOM头,以告诉其他编辑器以 Utf8 来显示字符,现在已经有很多软件识别 BOM 头。

但是在网页上并不需要添加 BOM 头识别,因为网页上可以使用 header 头指定 charset=utf8 告诉浏览器用 utf8 来解释。

除去BOM头

去掉 BOM 头的办法,最简单就是使用 editplus 或 ultraedit 等软件来操作,但是如果文件很多的话,而你又是使用的 PHP 作为开发语言,下面的这个方法可能比较适合你。

软件方法

使用 EditPlus 去除BOM头

编辑器调整为 UTF8 编码格式后,保存的文件前面会多出一串隐藏的字符(也即是BOM),用于编辑器识别这个文件是否是以 UTF8 编码。

运行 Editplus,点击工具,选择首选项,选中文件,UTF-8 标识选择总是删除签名,然后对 PHP 文件编辑和保存后的 PHP 文件就是不带 BOM 的了。

使用 UltraEdit 去除 BOM 头

打开文件后,另存为选项的编码格式里选择(UTF-8 无 BOM 头),确定就 OK 了。

使用 Notepad++ 去除 BOM 头

使用 Notepad++ 打开需要去除 BOM 头的文件,在菜单栏找到格式,点击 转化为 Utf-8 无 BOM 编码格式,然后保存文件即可。

使用 Notepad++ 去除 BOM 头

PHP 函数方法

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,然后上传到服务器,然后通过网址访问这个文件即可。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

lorenzathorton8

文章 0 评论 0

Zero

文章 0 评论 0

萧瑟寒风

文章 0 评论 0

mylayout

文章 0 评论 0

tkewei

文章 0 评论 0

17818769742

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文