[email protected]   15826058953
B2B外贸网站建设与运营,WEB服务器运维,始于2016。

网站页面顶部出现空白行或非法字符(&#65279)的解决方法

2020-09-20     网络    

网站页面顶部出现这种空白行,在查看HTML代码时,会在<body>后面发现有&#65279非法字符,页面的编码是UTF-8 + BOM。这种编码方式一般会在windows操作系统中出现,比如windows系统自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于PHP来说,BOM是个大麻烦。因为PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符&#65279!

解决方法一

使用subline或Notepad++等软件,将页面格式另存在为UTF-8 无dom格式,如下图:

但这种方法弊端是:一旦页面嵌套的文件比较多,特别是使用PHP框架开发的网站,只有其中一个文件有这种字符,就会出现这种情况,比较难查找。

解决方法二

可以使用以下代码放在网站根目录下,运行即可,它会将所有的文件(包括CSS与JS文件)都会进行清理,源码如下:

<?php 
// 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
$HOME = dirname(__FILE__);
// 如果是Windows系统,修改为:$WIN = 1;
$WIN = 0;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>UTF8 BOM 清除器</title>
<style>
body{font-size: 10px;font-family:Arial,Helvetica,sans-serif;background:#FFF;color:#000; }
.FOUND{color: #F30;font-size: 14px;font-weight:bold;}
</style>
</head>
<body>
<?php
$BOMBED = array();
RecursiveFolder($HOME);
echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
echo '</p>';
// 递归扫描
function RecursiveFolder($sHOME) {
	global $BOMBED, $WIN;
	$win32 = ($WIN == 1) ? "\\" : "/";
	$folder = dir($sHOME);
	$foundfolders = array();
	while ($file = $folder->read()) {
		if($file != "." and $file != "..") {
			if(filetype($sHOME . $win32 . $file) == "dir"){
			$foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
			} else {
				$content = file_get_contents($sHOME . $win32 . $file);
				$BOM = SearchBOM($content);
				if ($BOM) {
					$BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
					// 移出BOM信息
					$content = substr($content,3);
					// 写回到原始文件
					file_put_contents($sHOME . $win32 . $file, $content);
				}
			}
		}
	}
	$folder->close();
	if(count($foundfolders) > 0) {
		foreach ($foundfolders as $folder) {
			RecursiveFolder($folder, $win32);
		}
	}
}
// 搜索当前文件是否有BOM
function SearchBOM($string) { 
	if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
	return false; 
}
?>
</body>
</html>

操作效果图如下