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 相关文章推荐
cache_lite试用
Feb 14 PHP
ubuntu12.04使用c编写php扩展模块教程分享
Dec 25 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
Jun 23 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
Sep 09 PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
PHP工程师VIM配置分享
Dec 15 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
PHP中FTP相关函数小结
Jul 15 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
Apr 08 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/03/20 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
简单的通用表达式求10乘阶示例
2014/03/03 Python
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Python中的is和id用法分析
2015/01/26 Python
Python pickle模块用法实例
2015/04/14 Python
Python实现高效求解素数代码实例
2015/06/30 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
python将音频进行变速的操作方法
2020/04/08 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
怎样有效的进行自我评价
2013/10/06 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
趣味体育活动方案
2014/02/08 职场文书
淘宝好评语大全
2014/05/05 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang