现象:
本来计划在最顶部的导航栏,前面莫名其妙空一行。浏览器查看源码看不出任何问题,按F12打开控制台程序,发现<body>
标签下面多了两个;隐藏字符,导致导航栏前空了1行;
原因:
PHP源文件的编码格式为 UTF8-BOM,导致文件头部被自动添加饿了;这个隐藏字符会在<?php >
之前执行,虽然看不见,但是为占用一行的位置。
解决办法1:
用notepad++ 打开文件,菜单–>编码–>"转为 UTF8 编码”,并保存;
用sublime Text 打开文件,菜单–>文件–>保存编码–>UTF8;
缺点:如果你用框架,比如我用的laravel,不容易找到哪个文件有bom头。
解决办法2:
step1 在你的web程序的根目录下,创建一个PHP文件,命名为 bom.php
内容如下(以下代码来自互联网):
<?php
//有些php文件由于不小心保存成了含bom头的格式而导致出现一系列的问题。以下是批量清除bom头的代码
if (isset ( $_GET ['dir'] )) { //config the basedir
$basedir = $_GET ['dir'];
} else {
$basedir = '.';
}
$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) { // BOM 的前三个字符的ASCII 码分别为 239 187 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 );
}
step2 文件创建完成之后,找到 apache 的配置文件 httpd.conf
项目目录 DocumentRoot 设置为你的web程序的根目录,而非public目录,一般是public的上一级,然后重启 Apache;
为什么要这么做?因为bom.php 只会扫码同层的文件和文件夹,并文件夹内层扫描,这样修改可以确保整个项目的bom头全部被清理掉!
step3 浏览器访问你的bom.php 如:test.com/bom.php
页面执行完毕,恭喜你!所有bom头已经清除。
step4 最后一步,恢复你的DocumentRoot设置,并重启apache。
看看页面是不是正常了!不正常,给我留言,我可以帮你看看。