文档章节

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

雷xiao雨
 雷xiao雨
发布于 2014/04/18 10:16
字数 580
阅读 15
收藏 0

如果PHP文件头部包含BOM信息,就会输出一个空白,在很多时候会带来问题,比如我们session无法工作、cookie无法设置等等问题

原理:

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>


本文转载自:http://www.jb51.net/article/40307.htm

雷xiao雨
粉丝 1
博文 13
码字总数 4039
作品 0
朝阳
程序员
私信 提问
FusionChart setDataURL问题

使用FusionChart的setDataURL填充图表数据的时候很容易出现"invalid data xml"的错误。 原因:xml文件不可用,可能是中文编码的问题。( 当前xx.xml文件缺乏BOM标记(Byte Order Mark) ) ...

liuNico
2012/09/20
670
0
「PHP编程」PHP中的这些坑,PHP开发常见填坑备注

在日常开发中,我们经常碰到这样的问题,即有些PHP问题看似简单,一说就明,但是一到使用时就踩坑。比如,下面我所列的几条: 1、由于使用单引号,以“ ”为分割符,使用PHP函数explode分割字...

ZhangLG
2018/09/06
10
0
Outlook如何批量删除重复的邮件?去除重复邮件

Outlook如何批量删除重复的邮件?去除重复邮件 本文为修改文章,原创请参阅http://jingyan.baidu.com/article/ca41422fe2b7271eae99edc6.html 1. 简介 outlook duplicate items remover插件如...

大郭讲堂
2014/08/25
0
0
清除文件的 dom 头

window 开发时候使用记事本打开代码文件,记事本会在文件加上bom头 (字节顺序标记,传输标识) 使用 Nodepad++ 可以单个修改文件编码 使用框架的时候涉及的文件众多,可以使用代码批量去除dom...

18y
2018/01/02
138
0
清除 utf8Bom 插件--ClearBom

ClearBom Clear utf8 bom for Intellij IDEA Plugin 清除 utf8Bom插件 该插件基于 Intellij IDEA ,安装后方可使用。 支持功能 项目右键菜单,指定文件or文件夹,清除 bom...

SilenceSu
2017/05/19
455
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部