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 相关文章推荐
利用文件属性结合Session实现在线人数统计
Oct 09 PHP
我的论坛源代码(八)
Oct 09 PHP
php时间不正确的解决方法
Apr 09 PHP
php 魔术函数使用说明
Feb 21 PHP
php 定界符格式引起的错误
May 24 PHP
php 注释规范
Mar 29 PHP
如何使用PHP实现javascript的escape和unescape函数
Jun 29 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 PHP
PHP的PDO连接讲解
Jan 24 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 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过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
微信跳一跳python自动代码解读1.0
2018/01/12 Python
把pandas转换int型为str型的方法
2019/01/29 Python
PyQt5实现QLineEdit添加clicked信号的方法
2019/06/25 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
python 字典访问的三种方法小结
2019/12/05 Python
Python class的继承方法代码实例
2020/02/14 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
Linux如何命名文件--使用文件名时应注意
2014/05/29 面试题
软件部经理岗位职责范本
2014/02/25 职场文书
会计人员岗位职责
2014/03/19 职场文书
法律专业自荐信
2014/06/03 职场文书
出租房屋协议书
2014/09/14 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
党员反邪教心得体会
2016/01/15 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript