使用 PHP 程序自动检测并处理 UTF-8 文件中包含有的 BOM 头

学习笔记 马富天 2018-10-12 14:58:59 16 0

【摘要】好久没有更新博客了,今天在公司闲了下来,就打算写一个篇文章,更新一下动态。之前看到一篇关于 BOM 的文章,感觉写的很好,而且在开发中会经常遇到的问题,我整理了一下网上提供的一些方法,以后可能会经常采用到。

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

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

请输入图片名称

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

  1. $url = "http://www.baidu.com/1.txt";
  2. $data = file_get_contents($url);
  3. $data = trim($data, "xEFxBBxBF");    //  去掉 bom 头

版权归 马富天个人博客 所有

本文标题:《使用 PHP 程序自动检测并处理 UTF-8 文件中包含有的 BOM 头》

本文链接地址:http://www.mafutian.com/376.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

0

0

上一篇《 Wap 手机端页面 history.go(-1) 返回上一级页面的初始位置,而不是顶部的解决办法 》 下一篇《 使用 js 复制网页中的文本解决 web 页面、 ios 、 Android 系统互不兼容的两种方法 》

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码

TOP10

  • 浏览最多
  • 评论最多