如何使用PHP批量去除文件UTF8 BOM信息


Posted in PHP onAugust 05, 2013

原理:
UTF8文件,微软为了增加一个识别信息,有了BOM这个东西:BOM —— Byte Order Mark,缺省在Windows等平台上编辑的UTF8文件会在头部增加3个字节的标记信息,我们PHP引擎在处理的时候会完整读取整个PHP代码文档, 如果PHP文件头部包含BOM信息,就会输出一个空白,在很多时候会带来问题,比如我们session无法工作、cookie无法设置等等问题。

解决方法:
把头部BOM的3个字节信息识别出来,然后剔除掉。不过一般情况我们不知道哪个文件有BOM,或者是有很多文件,这个时候,就需要进行批量处理了,下面代码主要就是展现了批量处理的情况,应该会对大家工作中有帮助。

执行方法:
设置一个路径,然后直接执行就行。

<?php 
// 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)
$HOME = dirname(__FILE__);
// 如果是Windows系统,修改为:$WIN = 1;
$WIN = 0;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>UTF8 BOM 清除器</title>
<style>
body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
.FOUND { color: #F30; font-size: 14px; font-weight: bold; }
</style>
</head>
<body>
<?php
$BOMBED = array();
RecursiveFolder($HOME);
echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
foreach ($BOMBED as $utf) { echo $utf ."<br />\n"; }
echo '</p>';
// 递归扫描
function RecursiveFolder($sHOME) {
 global $BOMBED, $WIN;
 $win32 = ($WIN == 1) ? "\\" : "/";
 $folder = dir($sHOME);
 $foundfolders = array();
 while ($file = $folder->read()) {
  if($file != "." and $file != "..") {
   if(filetype($sHOME . $win32 . $file) == "dir"){
    $foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
   } else {
    $content = file_get_contents($sHOME . $win32 . $file);
    $BOM = SearchBOM($content);
    if ($BOM) {
     $BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
     // 移出BOM信息
     $content = substr($content,3);
     // 写回到原始文件
     file_put_contents($sHOME . $win32 . $file, $content);
    }
   }
  }
 }
 $folder->close();
 if(count($foundfolders) > 0) {
  foreach ($foundfolders as $folder) {
   RecursiveFolder($folder, $win32);
  }
 }
}
// 搜索当前文件是否有BOM
function SearchBOM($string) { 
  if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
  return false; 
}
?>
</body>
</html>
PHP 相关文章推荐
在PHP中使用Sockets 从Usenet中获取文件
Jan 10 PHP
php中变量及部分适用方法
Mar 27 PHP
PHP 加密解密内部算法
Apr 22 PHP
PHP的5个安全措施小结
Jul 17 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
php中chdir()函数用法实例
Nov 13 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
Laravel框架实现的批量删除功能示例
Jan 16 PHP
php面试中关于面向对象的相关问题
Feb 13 PHP
深入解析PHP中逗号与点号的区别
Aug 05 #PHP
php 读取文件头判断文件类型的实现代码
Aug 05 #PHP
PHP取二进制文件头快速判断文件类型的实现代码
Aug 05 #PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
Aug 05 #PHP
浅析Mysql 数据回滚错误的解决方法
Aug 05 #PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 #PHP
php多层数组与对象的转换实例代码
Aug 05 #PHP
You might like
初识laravel5
2015/03/02 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
2017/12/13 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
AOP的定义以及作用
2013/09/08 面试题
Java里面如何创建一个内部类的实例
2015/01/19 面试题
企业消防安全制度
2014/02/02 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
演讲稿的写法
2014/05/19 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
教师个人成长总结
2015/02/11 职场文书
运输公司工作总结
2015/08/11 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL