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中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
PHP 图片水印类代码
Aug 27 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
PHP数组无限分级数据的层级化处理代码
Dec 29 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
Jun 06 PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 PHP
PHP+redis实现添加处理投票的方法
Nov 14 PHP
Yii2实现增删改查后留在当前页的方法详解
Jan 13 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 PHP
PHP PDOStatement::columnCount讲解
Jan 30 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截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
php 分库分表hash算法
2009/11/12 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
php中simplexml_load_file函数用法实例
2014/11/12 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
php文件操作相关类实例
2015/06/18 PHP
PHP中Array相关函数简介
2016/07/03 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
原生js生成图片验证码
2020/10/11 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
python3使用urllib模块制作网络爬虫
2016/04/08 Python
浅谈python中的占位符
2017/11/09 Python
python机器学习库常用汇总
2017/11/15 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
深入了解NumPy 高级索引
2020/07/24 Python
担保书格式及范文
2014/04/01 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
工伤事故证明
2014/10/20 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
MySQL大小写敏感的注意事项
2021/05/24 MySQL
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
Django模型层实现多表关系创建和多表操作
2021/07/21 Python