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 xml文件操作实现代码(二)
Mar 20 PHP
php面向对象全攻略 (五) 封装性
Sep 30 PHP
php UTF8 文件的签名问题
Oct 30 PHP
php开发文档 会员收费1期
Aug 14 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
提高PHP编程效率的方法
Nov 07 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
Feb 18 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
php多线程并发实现方法
Sep 30 PHP
PHP在线打包下载功能示例
Oct 15 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 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
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
PHP正确解析UTF-8字符串技巧应用
2012/11/07 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
js实现DIV的一些简单控制
2007/06/04 Javascript
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
深入理解Node module模块
2018/03/26 Javascript
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python在每个字符后添加空格的实例
2018/05/07 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
python代码打印100-999之间的回文数示例
2019/11/24 Python
python实现图像拼接
2020/03/05 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
PHP面试题集
2016/12/18 面试题
公务员政审材料
2014/12/23 职场文书
四年级小学生评语
2014/12/26 职场文书
汽车转让协议书
2015/01/29 职场文书
青年文明号创建口号大全
2015/12/25 职场文书