如何使用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模拟HTTP认证
Oct 09 PHP
在PHP中读取和写入WORD文档的代码
Apr 09 PHP
Memcache 在PHP中的使用技巧
Feb 08 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
Jun 16 PHP
PHP中使用数组指针函数操作数组示例
Nov 19 PHP
PHP处理大量表单字段的便捷方法
Feb 07 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
Yii2 GridView实现列表页直接修改数据的方法
May 16 PHP
PHP设计模式之迭代器模式
Jun 17 PHP
PHP中for循环与foreach的区别
Mar 06 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 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
长波有什么东西
2021/03/01 无线电
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
js 字符串操作函数
2009/07/25 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
深度解读vue-resize的具体用法
2020/07/08 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
Python实现最常见加密方式详解
2019/07/13 Python
Form表单及django的form表单的补充
2019/07/25 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
警察思想汇报
2014/01/04 职场文书
幼儿园义卖活动方案
2014/01/17 职场文书
文明倡议书范文
2014/04/15 职场文书
市政管理求职信范文
2014/05/07 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
2015年化验员工作总结
2015/04/10 职场文书
捐书仪式主持词
2015/07/04 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
如何书写邀请函?
2019/06/24 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
浅谈python中的多态
2021/06/15 Python
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby
mysql 子查询的使用
2022/04/28 MySQL