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 文件上传全攻略
Apr 28 PHP
整理的9个实用的PHP库简介和下载
Nov 09 PHP
PHP中simplexml_load_string函数使用说明
Jan 01 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
使用PHP接收POST数据,解析json数据
Jun 28 PHP
Linux编译升级php的详细方法
Nov 04 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
Nov 05 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
php字符串操作常见问题小结
Oct 11 PHP
laravel 使用auth编写登录的方法
Sep 30 PHP
Laravel框架源码解析之入口文件原理分析
May 14 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 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批量采集下载美女图片的实现代码
2013/06/03 PHP
php mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
详解JavaScript函数
2015/12/01 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
python操作MySQL数据库的方法分享
2012/05/29 Python
Python异常处理操作实例详解
2018/05/10 Python
详解Python if-elif-else知识点
2018/06/11 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
python实现滑雪者小游戏
2020/02/22 Python
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
一些PHP的面试题
2015/05/06 面试题
高中体育教学反思
2014/01/29 职场文书
考试违纪检讨书
2014/02/02 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
家长通知书家长意见
2014/12/30 职场文书
大学生实习证明
2015/06/16 职场文书