• 问题总会出现,不过解决问题的方法也会出现!!!

UTF8 BOM导致网页多一行空白的解决办法

问题处理 小雨 527次浏览 已收录 0个评论

网页顶部和搜索框的位置突然多了一个空白行,有时有,有的时候消失,一出现空白行,就会将网页样式改变。一查才知道。就是因为页面编码时加了BOM,才导致的空白行,怎么也去不掉。

BOM头既BOM: Byte Order Mark

UTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,是为了支援UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示。

如果多个文件设置了签名,在二进制流中就会包含多个UTF-8签名,而IE是无法识别多个UTF-8签名的,所以用一个空行来代替,在某些程序处理中还会出现一个类似“锘?”的字符。

对于BOM,PHP并不会忽略,在读取、包含或者引用这些文件时,PHP会把BOM作为文件开头正文的一部分,根据嵌入式语言的特点,这串字符将被直接执行(显示)出来.这就导致了一些页面的头部总是有一条白条。

更严重的会导致COOKIE、SESSION实现的功能全部无效。

以下是我在网上搜索到别人提供的解决方法:(By:狂奔的乌龟技术博客)
在编辑、更改任何文本文件时,请务必使用不会乱加BOM的编辑器。Linux下的编辑器应该都没有这个问题。WINDOWS下,请勿使用记事本等编辑器。

推荐的编辑器是:
1、Editplus 2.12版本以上;
2、EmEditor;
3、UltraEdit(需要取消‘添加BOM’的相关选项);
4、Dreamweaver(需要取消‘添加BOM’的相关选项);(我是用的这个方法,用DW把所有修改过的文件打开,再另存一遍,另存的时候取消BOM选项

UTF8 BOM导致网页多一行空白的解决办法
5、Notepad(需要进行“转换为不带BOM的UTF-8”)等。
6、对于已经添加了BOM的文件,要取消的话,可以用以上编辑器另存一次。(Editplus需要先另存为gb,再另存为UTF-8。)

蓝祖生的博客,写到了可以利用以下方法,批量指定取消BOM签名。(我没有进行测试,访客请自己视情况是否采用以下方法

其他的对于已经添加了BOM的文件,要取消的话,可以用不会乱加BOM的编辑器另存一次.也可以使用以下方法去除该目录下所有文件的头部BOM

把以下代码复制到一个PHP文件里面,运行该PHP文件,就可以批量清除该文件相同目录下所有文件的头部BOM.

<?php

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);

              }

           }

       }

       closedir($dh);

    }

}

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.");

}

function rewrite ($filename, $data) {

    $filenum = fopen($filename, "w");

    flock($filenum, LOCK_EX);

    fwrite($filenum, $data);

    fclose($filenum);

}

?-->

指定目录或文件清除BOM:

<!--?php

if(isset($_GET['dir']) && !empty($_GET['dir'])){ //设置文件目录

    $basedir=$_GET['dir'];

}else{

    $basedir = '.';

}

if(empty($_GET['filename'])){                        //设置文件

    $auto = 1;

    checkdir($basedir);

}else{

    $file = $_GET['filename'];

    echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>";

}

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);

              }

           }

       }

       closedir($dh);

    }

}

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.");

    }

function rewrite ($filename, $data) {

    $filenum = fopen($filename, "w");

    flock($filenum, LOCK_EX);

    fwrite($filenum, $data);

    fclose($filenum);

}

?>

本博客内容既有转载自网络的内容,也有本作者原创内容,仅供学习与交流之用
如有侵权或者错误之处,请及时在下方留言!
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址