去除BOM头问题

时间:2022-10-25 21:31:41

BOM头的问题,不算致命性错误,就是在页面顶部出现留白,出现的原因就是编码格式的问题。接下来说一下我的解决方法。

1.第一个非常有用的方法就是哪个页面出先BOM头问题了,找到跳转到这个页面的控制器中的方法,在这个方法最前面加上ob_end_clean().

原理:ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲。这个BOM头相当于即时输出一些东西。你在要输出模板之前ob_end_clean(),就相当于清除前面的输出,就可以了。一般在控制器方法前面不需要输出任何东西吧,这样就可以达到去除BOM的目的。有没有BOM,加这句都不会影响其它程序运行。

例:

public function message(){

ob_end_clean();

$mod = M('XXX');
$id = $_GET['id'];
$list = $mod->where('id='.$id)->find();
$this->assign('list',$list);
$this->display();
}
此函数丢弃最顶层输出缓冲区的内容并关闭这个缓冲区。如果想要进一步处理缓冲区的内容,必须在 ob_end_clean()之前调用 ob_get_contents(),因为当调用 ob_end_clean()时缓冲区内容将被丢弃。而且如果此函数失败,将会抛出E_NOTICE异常。


2.第二种是用程序进行递归文件夹目录达到清除所有的文件中的BOM头。将该文件放在项目根目录下面运行一次,即可解决.(之后可删除掉该文件)

<?php
if (isset($_GET['dir'])){ //config the basedir
$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);
}