PHP实现UTF-8文件BOM自动检测与移除实例
本文实例讲述了PHP实现UTF-8文件BOM自动检测与移除的方法。分享给大家供大家参考。具体实现方法如下:
BOM信息是文件开头的一串隐藏的字符,用于让某些编辑器识别这是个UTF-8编码的文件。但PHP在读取文件时会把这些字符读出,从而形成了文件开头含有一些无法识别的字符的问题。
比如用UTF-8格式保存的生成图片的PHP文件,因为文件头隐藏的BOM信息也被下发,导致生成的图片数据不对,浏览器无法识别。
要检测一个UTF-8文件是否含有BOM信息,就是检测文件开头的字三个符,是否为0xEF,0xBB,0xBF。下面这个小程序,用户遍历某个目录下所有文件,并检测是否加了BOM。
<?php //此文件用于快速测试UTF8编码的文件是不是加了BOM,并可自动移除 //ByBobShen
$basedir=".";//修改此行为需要检测的目录,点表示当前目录 $auto=1;//是否自动移除发现的BOM信息。1为是,0为否。
//以下不用改动
if($dh=opendir($basedir)){ while(($file=readdir($dh))!==false){ if($file!='.'&&$file!='..'&&!is_dir($basedir."/".$file))echo"filename:$file".checkBOM("$basedir/$file")."<br>"; } closedir($dh); }
functioncheckBOM($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("<fontcolor=red>BOMfound,automaticallyremoved.</font>"); }else{ return("<fontcolor=red>BOMfound.</font>"); } } elsereturn("BOMNotFound."); }
functionrewrite($filename,$data){ $filenum=fopen($filename,"w"); flock($filenum,LOCK_EX); fwrite($filenum,$data); fclose($filenum); }