PHP实现UTF-8文件BOM自动检测与移除实例


Posted in PHP onNovember 05, 2014

本文实例讲述了PHP实现UTF-8文件BOM自动检测与移除的方法。分享给大家供大家参考。具体实现方法如下:

BOM信息是文件开头的一串隐藏的字符,用于让某些编辑器识别这是个UTF-8编码的文件。但PHP在读取文件时会把这些字符读出,从而形成了文件 开头含有一些无法识别的字符的问题。

比如用UTF-8格式保存的生成图片的PHP文件,因为文件头隐藏的BOM信息也被下发,导致生成的 图片数据不对,浏览器无法识别。

要检测一个UTF-8文件是否含有BOM信息,就是检测文件开头的字三个符,是否为0xEF, 0xBB, 0xBF。下面这个小程序,用户遍历某个目录下所有文件,并检测是否加了BOM。

<?php

//此文件用于快速测试UTF8编码的文件是不是加了BOM,并可自动移除

//By Bob Shen
$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);

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

}

将以上代码另存为del_bom.php,修改需要检测的目录后运行。这样可能有助于检测是哪个文件带有了BOM信息导致所有页面开头都有 那么一段空白。

把下面 代码保存为 bom.php  记得保存为 utf8 格式

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<h3><?echo $_POST["dir"];?>目录下的检测结果</h3>

<?php

//此文件用于快速测试UTF8编码的文件是 不是加了BOM,并可自动移除

//By bob 老大

//风吟修改

$目录= str_replace(" ", "|", $_POST["dir"]);//接受提交的路径数据

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

}

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 已经清除完毕。</font>");

} else {

return ("<font color=red>--Bom found.</font>");

}

} 

else return ("--没有检查到Bom.");

}

function rewrite ($filename, $data) {

$filenum=fopen($filename,"w");

flock($filenum,LOCK_EX);

fwrite($filenum,$data);

fclose($filenum);

}

?>
<form action="" method="POST">

目录: <input type="text" name="dir" />

<input type="submit" value="检测目录" >

</form>

请 输入文件夹名比如 plugin/fanfou 后面不需要加/。如果要检测根目录输入“ . ”  . 是小数点 提交既可

</br>

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP实现域名whois查询的代码(数据源万网、新网)
Feb 22 PHP
用php或asp创建网页桌面快捷方式的代码
Mar 23 PHP
php curl的深入解析
Jun 02 PHP
php定时计划任务的实现方法详解
Jun 06 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 PHP
php生成excel文件的简单方法
Feb 08 PHP
PHP中通过fopen()函数访问远程文件示例
Nov 18 PHP
8个PHP数组面试题
Jun 23 PHP
PHP引用的调用方法分析
Apr 25 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
wordpress网站转移到本地运行测试的方法
Mar 15 PHP
PHP查询分页的实现代码
Jun 09 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 #PHP
php画图实例
Nov 05 #PHP
PHP队列用法实例
Nov 05 #PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 #PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 #PHP
PHP操作MySQL事务实例
Nov 05 #PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 #PHP
You might like
php4与php5的区别小结(配置异同)
2011/12/20 PHP
如何用php获取程序执行的时间
2013/06/09 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
javascript第一课
2007/02/27 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
python中的列表推导浅析
2014/04/26 Python
python如何使用unittest测试接口
2018/04/04 Python
使用Python进行目录的对比方法
2018/11/01 Python
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
英文版网络工程师求职信
2013/10/28 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
品牌转让协议书
2014/08/20 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书