UTF-8文件的Unicode签名BOM(Byte Order Mark)问题

原创 2007年08月03日 13:35:00

近日在调测一个UTF8编码的中文Zen Cart网站时遇到一件怪事,网页显示文字正常,用ie的察看源文件(记事本打开)却发现乱码,firefox没有这个问题。经在网上多方查证和多次测试,解决了这个问题,其实是UTF-8文件的Unicode签名BOM(Byte Order Mark)问题。

BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当作正常字符处理。

微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。

也就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。1,用UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有EF BB BF。2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。3,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。

我找到Zen Cart的模版文件中的html_header.php,发现文件果然不带BOM,用UltraEdit-32另存为的方式加上BOM后,再上传html_header.php,一切正常。

注意用Convertz把gb2312文件转换成UTF-8文件时,默认设置是不带BOM的。不带BOM可能出现上述乱码问题,但是带 BOM,对于php的include文件要小心,会在php字节流前面多出EF BB BF,提前输出到显示器有可能会带来程序错误。一个解决方案是凡是被include的文件都保存为ANSI,主文件可以是UTF-8。要想把一个文件去掉 BOM,使用UlterEdit打开, 切换到十六进制编辑模式,把最前面三个字节(就是那该死的 EF BB BF)替换为20,保存(注意关闭保存时自动备份的功能),再切换到默认编辑模式,把最前面的三个空格去掉就可以了。

另外还学到一些编码的小知识:所谓的unicode保存的文件实际上是utf-16,只不过恰好跟unicode的码相同而已,但在概念上unicode与utf是两回事,unicode是内存编码表示方案,而utf是如何保存和传输unicode的方案。utf-16还分高位在前 (LE)和高位在后(BE)两种。官方的utf编码还有utf-32,也分LE和BE。非unicode官方的utf编码还有utf-7,主要用于邮件传输。utf-8的单字节部分是和iso-8859-1兼容的,这主要是一些旧的系统和库函数不能正确处理utf-16而被迫出来的,而且对英语字符来说,也节省保存的文件空间(以非英语字符浪费空间为代价)。在iso-8859-1的时候,utf8和iso-8859-1都是用一个字节表示的,当表示其它字符的时候,utf-8会使用两个或三个字节。 

什么是BOM(byte-order mark)(转贴)

什么是BOM BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型。对...
  • Sea_Shore
  • Sea_Shore
  • 2014年03月31日 15:46
  • 2243

该死的BOM(byte-order mark)

该死的BOM(byte-order mark) 2011-11-02 创建     最近接连遇到两个奇怪的事情,一,在WINDOWS CYGWIN下可以编译的C++代码文件,到了LINUX环境下使...
  • firefight
  • firefight
  • 2011年11月02日 10:06
  • 4714

BOM(Byte-order Mark)

Byte-order MarkAlways prefix a Unicode plain text file with a byte-order mark. Because Unicode plain...
  • wyingquan
  • wyingquan
  • 2008年12月07日 04:16
  • 7865

什么是BOM(Byte Order Mark)?

BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码,但它对于文件的读者来说是不可见字符。下表列出不同的字符编码的BOM...
  • testcs_dn
  • testcs_dn
  • 2015年05月20日 17:51
  • 2916

Eclipse 中 字符无效 和 The byte order mark (BOM) is UTF-8解决方法

经常性的在eclipse中使用编码的时候,会遇到这种情况。 can not resolved as a type 或者是  系统找不到符号等等。   这时候使用eclipse在文档上点击“右键...
  • Dracotianlong
  • Dracotianlong
  • 2014年02月25日 10:04
  • 5980

UTF-8编码格式的Byte Order Mark问题

前两天同事编写的SQL Server数据库脚本文件交给我运行时,出现了syntax error的错误,但将文件内容拷贝到SQL Server Management Studio里面运行时却一切正常。。...
  • zhuihunke_2008
  • zhuihunke_2008
  • 2016年12月01日 15:47
  • 212

Byte order mark (BOM)

Byte order mark (BOM)本文部分转载自:Byte order mark - Wikipedia字节序标志: Encoding Representation (hexadeci...
  • yyinhai
  • yyinhai
  • 2016年12月25日 22:15
  • 187

字节顺序(byte order)

转自:http://blog.csdn.net/njnu_mjn/article/details/9141231 概念 字节顺序是指多字节的值在硬件中的存储顺序. 一般分为大端(big...
  • u011334621
  • u011334621
  • 2016年09月14日 17:58
  • 713

BOM(byte-order mark):字节顺序标记

什么是BOM BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型...
  • u014563989
  • u014563989
  • 2016年11月08日 20:35
  • 492

UTF-8文件的Unicode签名BOM(Byte Order Mark)

参考来源: http://blog.csdn.net/thimin/archive/2007/08/03/1724393.aspx BOM(Byte Order Mark),是UTF编码方案里用于标识...
  • maomivan
  • maomivan
  • 2010年04月13日 23:16
  • 241
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UTF-8文件的Unicode签名BOM(Byte Order Mark)问题
举报原因:
原因补充:

(最多只允许输入30个字)