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 在线翻译函数代码
May 07 PHP
小文件php+SQLite存储方案
Sep 04 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
解析yahoo邮件用phpmailer发送的实例
Jun 24 PHP
php缓冲 output_buffering和ob_start使用介绍
Jan 30 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
Apr 30 PHP
php数组转成json格式的方法
Mar 09 PHP
PHP函数超时处理方法
Feb 14 PHP
CI框架扩展系统核心类的方法分析
May 23 PHP
php如何执行非缓冲查询API
Jul 22 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
Oct 17 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
基于mysql的bbs设计(三)
2006/10/09 PHP
PHP生成唯一订单号
2015/07/05 PHP
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
Python pickle模块用法实例
2015/04/14 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
python实战教程之自动扫雷
2018/07/13 Python
python url 参数修改方法
2018/12/26 Python
pytorch中图像的数据格式实例
2020/02/11 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
HTML5地理定位_动力节点Java学院整理
2017/07/12 HTML / CSS
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
北京天润融通.net面试题笔试题
2012/02/20 面试题
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
餐厅经理岗位职责范本
2014/02/17 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
办公经费申请报告
2015/05/15 职场文书
酒店厨房管理制度
2015/08/06 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis