問題:
模板文件生成html文件之后會在body開頭處加入一個可見的控制符,導(dǎo)致頁面頭部會出現(xiàn)一個空白行。原因是頁面的編碼是UTF-8 + BOM。
問題原因:
這種編碼方式一般會在windows操作系統(tǒng)中出現(xiàn),比如windows自帶的記事本等軟件,在保存一個以UTF-8編碼的文件時,會在文件開始的地方插入三個不可見的字符(0xEF 0xBB 0xBF,即BOM)。
它是一串隱藏的字符,用于讓記事本等編輯器識別這個文件是否以UTF-8編碼。對于一般的文件,這樣并不會產(chǎn)生什么麻煩。但對于 PHP來說,BOM是個大麻煩。因為PHP并不會忽略BOM,所以在讀取、包含或者引用這些文件時,會把BOM作為該文件開頭正文的一部分。
根據(jù)嵌入式語言的特點,這串字符將被直接執(zhí)行(顯示)出來。由此造成即使頁面的 top padding 設(shè)置為0,也無法讓整個網(wǎng)頁緊貼瀏覽器頂部,因為在html一開頭有這3個隱藏字符!
導(dǎo)致的問題:
1.網(wǎng)站打開空白
2.頁面頭部出現(xiàn)多余的空白
3.網(wǎng)站出現(xiàn)亂碼,如“锘?”
解決方法一:使用編輯器修改文件編碼格式
1.選用專業(yè)的編輯器,例如 notepad++,sublime,editplus 這樣不會自動簽名。
2.sublime通過如下操作File -> Save with Encoding -> UTF-8保存后即可去除 bom
3.notepad++選中格式 -> 以 UTF-8 格式編碼選項即可去除
解決方法二:使用代碼將網(wǎng)站中BOM都清除
然而有的是整個網(wǎng)站中有些文件存在 BOM 屬性,由于網(wǎng)站程序的龐大,所以并不可能手動挨個檢查排除修復(fù),所以就發(fā)現(xiàn)了一個極為好用的 PHP 程序。
?。?!通過此段代碼可以快速將網(wǎng)站中的bom清除掉
使用方法:復(fù)制下面代碼到一個新建的 delbom.txt 的文件中,上傳到網(wǎng)站根目錄,然后將 delbom.txt 改為 delbom.php,最后直接前臺訪問該文件即可。
代碼:
<?php
if (isset($_GET['dir'])){ //設(shè)置文件目錄
$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);
}
?>
這是執(zhí)行效果:
