首页 >> 网页技术 > 编程技术 >> 详细内容
编程技术 >> 正文
使用PHP程序自动检测并处理UTF-8文件中包含有的BOM头
日期:2018/10/20 

BOM 是啥东西呢,其实我也不是很清楚,具体是啥,网上说的是在 windows 系统下自带的记事本 txt 等软件,在保存一个 utf-8 编码的文件时,会在文件开始的地方插入三个不可见的字符,隐藏着。它在 PHP 开发中是一个很让人头疼的东西,如果在 html 文件、 js 文件、xml 文件、 txt 文件中出现这个 BOM 头,将会大大小小的影响开发,有时候会摸不着头脑,找不到原因,而本文就直接把解决方法给出来,也是参考网上他人写的程序,进行了修改。

PHP 在读取这些文件中存在的 BOM 头时,会将其当成是文件内容的一部分,这样就会导致,输出内容的时候多了这段 BOM 头,而往往我们读取的内容是 xml 格式内容、json 格式内容等等,而多了 bom 头,我们就无法解析 xml、json 等等数据。而在 js 文件中,如果多了 bom 字符,则浏览器会无法解析,判断 js 语法错误,这也是因浏览器将 bom 字符当成了 js 的一部分,导致解析错误。

以下的代码已用来检测指定目录下面所有文件、子文件是否包含 BOM 头,并可以选择是否去除这些文件中包含的 BOM 头:

  1. if(isset($_GET['dir']))
  2. { 
  3. 	//config the basedir 
  4. 	$basedir = $_GET['dir']; 
  5. }else
  6. { 
  7. 	$basedir = '.';	//	默认是当前目录
  8. } 
  9. 
    	
  10. $auto = 0;	//	是否自动去掉 BOM 头,默认不去除
  11. 
    	
  12. checkdir($basedir);
  13. 
    	
  14. function checkdir($basedir)
  15. { 
  16. 	if($dh = opendir($basedir)) 
  17. 	{ 
  18. 		while(($file = readdir($dh)) !== false) 
  19. 		{ 
  20. 			if($file != '.' && $file != '..')
  21. 			{ 
  22. 				if(!is_dir($basedir."/".$file)) 
  23. 				{ 
  24. 					echo "filename $basedir/$file ".checkBOM("$basedir/$file")." <br>"; 
  25. 				}else
  26. 				{ 
  27. 					$dirname = $basedir."/".$file; 
  28. 					checkdir($dirname); 
  29. 				} 
  30. 			} 
  31. 		} 
  32. 		closedir($dh); 
  33. 	} 
  34. } 
  35.    
  36. function checkBOM($filename) 
  37. { 
  38. 	global $auto; 
  39. 	$contents = file_get_contents($filename); 
  40. 	$charset[1] = substr($contents, 0, 1); 
  41. 	$charset[2] = substr($contents, 1, 1); 
  42. 	$charset[3] = substr($contents, 2, 1); 
  43. 	if(ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) 
  44. 	{ 
  45. 		if($auto == 1) 
  46. 		{ 
  47. 			$rest = substr($contents, 3); 
  48. 			rewrite ($filename, $rest); 
  49. 			return "<font color=red>BOM found, automatically removed.</font>"; 
  50. 		} else 
  51. 		{ 
  52. 			return "<font color=red>BOM found.</font>"; 
  53. 		} 
  54. 	} 
  55. 	else return "BOM Not Found."; 
  56. } 
  57.    
  58. function rewrite($filename, $data) 
  59. {
  60. 	$filenum = fopen($filename, "w"); 
  61. 	flock($filenum, LOCK_EX); 
  62. 	fwrite($filenum, $data); 
  63. 	fclose($filenum); 
  64. }

将这段代码放到指定的文件夹下面,然后在浏览器中执行这段程序,就可以自动检测同一文件夹下面所有文件、子文件的 BOM 头存在情况,检测结果如下:

请输入图片名称

最后的话,给出一个快捷的方法,在读取一份含有 BOM 头的内容中,去掉内容中的 BOM 字符: