时间: 2010-07-07 / 分类: WEB后端编程 - 开发与实践 / 浏览次数: / 3 个评论 发表评论
UTF-8文件的Unicode签名BOM(Byte Order Mark)问题
项目前端开发的架构
12条经典摄影技巧
WEB前端开发中的一些编程风格和书...
黄金分割与摄影构图
保存UTF-8文件的时候,出现有空格的情况,找了好久没有发现问题所在,后来以为是保存为ANSI格式,结果发现既不是ANSI格式,也不是UTF-8格式,而是保存为UTF-8 + BOM所引起的。

UTF-8文件的Unicode签名BOM(Byte Order Mark)问题 (Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。

Unicode规范中有一个BOM的概念。BOM——Byte Order Mark,就是字节序标记。关于BOM的说明:

在UCS编码中有一个叫做”ZERO WIDTH NO-BREAKSPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAKSPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。 UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。 Windows就是使用BOM来标记文本文件的编码方式的。

另外unicode网站的FAQ-BOM详细介绍了BOM。官方的自然权威,不过是英文的,看起来比较费劲。 UTF-8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开头的FFFE了。这是个标识UTF-8编码文件的好办法,软件通过BOM来识别这个文件是否是UTF-8编码,很多软件还要求读入的文件必须带BOM。可是,还是有很多软件不能识别BOM。我在研究Firefox的时候就知道,在Firefox早期的版本里,扩展是不能有BOM的,不过Firefox1.5以后的版本已经开始支持BOM了。现在又发现,PHP也不支持BOM。 PHP在设计时就没有考虑BOM的问题,也就是说他不会忽略UTF-8编码的文件开头BOM的那三个字符。其中有提到另一个麻烦:“受COOKIE送出机制的限制,在这些文件开头已经有BOM的文件中,COOKIE无法送出(因为在COOKIE送出前PHP已经送出了文件头),所以登入和登出功能失效。一切依赖COOKIE、SESSION实现的功能全部无效。”这个应该就是Wordpress后台出现空白页面的原因了,因为任何一个被执行的文件包含了BOM,这三个字符都将被送出,导致依赖cookies和session的功能失效。解决的办法嘛,如果只包含英文字符(或者说ASCII编码内的字符),就把文件存成ASCII码方式吧。用UE等编辑器的话,点文件->转换->UTF-8转ASCII,或者在另存为里选择ASCII编码。如果是DOS格式的行尾符,可以用记事本打开,点另存为,选ASCII编码。如果包含中文字符的话,可以用Ultraedit或者Editplus的另存为功能,选择 “ 无BOM”即可。请参考下面的图片

PHP版UTF-8文件BOM自动检测移除程序 BOM信息是文件开头的一串隐藏的字符,用于让某些编辑器识别这是个UTF-8编码的文件。但PHP在读取文件时会把这些字符读出,从而形成了文件开头含有一些无法识别的字符的问题。 比如用UTF-8格式保存的生成图片的PHP文件,因为文件头隐藏的BOM信息也被下发,导致生成的图片数据不对,浏览器无法识别。 要检测一个UTF-8文件是否含有BOM信息,就是检测文件开头的字三个符,是否为0xEF, 0xBB, 0xBF。下面这个小程序,用户遍历某个目录下所有文件,并检测是否加了BOM。

  1. 用notepad++,别用记事本。

    回复

    阿米酷 回复:

    我之前用Editplus,自从我被强制在机器上不许安装用盗版软件之后,我开始觉得Notepad++也挺强大的了

    回复

  站点地图 | 关于我 | 返回顶部
Copyright © 2001-2013 { amiku.cn | zhangshunjin.com }. Powered by 

阿米酷

张顺金


浙ICP备11002820号-1