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缓存技术介绍
Nov 25 PHP
MySQL连接数超过限制的解决方法
Jul 17 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
Apr 23 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
Apr 01 PHP
CI框架中cookie的操作方法分析
Dec 12 PHP
php使用MySQL保存session会话的方法
Jun 26 PHP
基于php实现七牛抓取远程图片
Dec 01 PHP
基于PHP后台的Android新闻浏览客户端
May 23 PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
Laravel多域名下字段验证的方法
Apr 04 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
YII Framework框架教程之安全方案详解
2016/03/14 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
跟老齐学Python之类的细节
2014/10/13 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
python绘制简单彩虹图
2018/11/19 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
旷课检讨书500字
2014/10/14 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
嘉宾邀请函
2015/01/31 职场文书
承诺保证书格式
2015/02/28 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
六年级作文之家庭作文
2019/12/12 职场文书