去除BOM头问题

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

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