博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】好久没有更新博客了,今天在公司闲了下来,就打算写一个篇文章,更新一下动态。之前看到一篇关于 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 头:
if(isset($_GET['dir']))
{
//config the basedir
$basedir = $_GET['dir'];
}else
{
$basedir = '.'; // 默认是当前目录
}
$auto = 0; // 是否自动去掉 BOM 头,默认不去除
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);
}
将这段代码放到指定的文件夹下面,然后在浏览器中执行这段程序,就可以自动检测同一文件夹下面所有文件、子文件的 BOM 头存在情况,检测结果如下:
最后的话,给出一个快捷的方法,在读取一份含有 BOM 头的内容中,去掉内容中的 BOM 字符:
$url = "http://www.baidu.com/1.txt";
$data = file_get_contents($url);
$data = trim($data, "xEFxBBxBF"); // 去掉 bom 头
版权归 马富天个人博客 所有
本文标题:《使用 PHP 程序自动检测并处理 UTF-8 文件中包含有的 BOM 头》
本文链接地址:http://www.mafutian.com/376.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0
评论审核未开启 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||