现在的位置: 首页 > 综合 > 正文

UTF Byte Order Mark (BOM) FAQ

2012年11月13日 ⁄ 综合 ⁄ 共 802字 ⁄ 字号 评论关闭

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。

UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到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编码了。

Bytes                Encoding Form 
00 00 FE FF          UTF-32, big-endian 
FF FE 00 00          UTF-32, little-endian 
FE FF                UTF-16, big-endian 
FF FE                UTF-16, little-endian 
EF BB BF             UTF-8

 

http://blog.sina.com.cn/s/blog_3e9d2b350100as0b.html
http://www.jb51.net/article/9794.htm

抱歉!评论已关闭.