2012年11月14日星期三

BOM!!!

BOM: Byte Order Mark 
UTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,是为了支援UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉弱编辑器(记事本)当前文件采用何种编码,方便编辑器识别。

PHP在设计之初,没有考虑到BOM头的问题,因此很容易因为BOM头引发诡异的问题,比如编码转换失败,样式错乱等等问题,而且此问题相当隐蔽,很难确定发生问题的文件(试想在没有工具的情况下从上万的工程文件中找到哪个文件带有BOM头)。

 

BOM头是隐藏字符,非编辑字符,就像普通空文件一样,当我们写<?php的时候其实之前已经加了BOM头,如下(file.php):

  1. {BOM头}<?php 
  2.  
  3. ..... 

当file.php被其他文件包含时,由于BOM头在php标签外,会当作输出内容输出到浏览器,然后引发问题(如果用gbk察看  会看到三个乱码的字符)。

 

所以我们在开发过程中,得创建不包含BOM头的UTF8文件,具体见编辑器设置。对于上传文件,用代码截取BOM头即可

  1. if ( substr$data, 0, 3 ) == "\xEF\xBB\xBF" ){ 
  2.  $data=substr_replace( $data'', 0, 3 ) ; 

 

注意:在Windows下用记事本之类的程序将文本文件保存为UTF-8格式时,记事本会在文件前面加上几个不可见的字符(EF BB BF),就是所谓的BOM(Byte order Mark)。