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