如何使用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 相关文章推荐
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
Dec 05 PHP
php中使用接口实现工厂设计模式的代码
Jun 17 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
Jun 21 PHP
PHP 提取图片img标记中的任意属性的简单实例
Dec 10 PHP
php curl post 时出现的问题解决
Jan 30 PHP
CodeIgniter安全相关设置汇总
Jul 03 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
分享PHP守护进程类
Dec 30 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
php微信公众号开发之简答题
Oct 20 PHP
PHP echo()函数讲解
Feb 15 PHP
PHP中Session ID的实现原理实例分析
Aug 17 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
php.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
PHP生成唯一订单号的方法汇总
2015/04/16 PHP
PHP new static 和 new self详解
2017/02/19 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
Python下Fabric的简单部署方法
2015/07/14 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Python docx库用法示例分析
2019/02/16 Python
pycharm实现print输出保存到txt文件
2020/06/01 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
.NET remoting中对象激活的两种方式
2015/06/08 面试题
大学生农村教师实习自我鉴定
2013/09/21 职场文书
酒店服务与管理毕业生求职信
2013/11/02 职场文书
省级四好少年事迹材料
2014/01/25 职场文书
销售助理岗位职责
2014/02/21 职场文书
进步之星获奖感言
2014/02/22 职场文书
作风转变心得体会
2014/09/02 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers