韩言福地

只有想不到的,没有办不到的。 - HY Auspicious Place

关键字:
首页 点击这里给我发消息

几种UTF-16的区别

浏览量:219 更新时间:2011-7-18 15:32:29

http://www.unicode.org/faq/utf_bom.html#5

Name UTF-8 UTF-16 UTF-16BE UTF-16LE UTF-32 UTF-32BE UTF-32LE
Smallest code point 0000 0000 0000 0000 0000 0000 0000
Largest code point 10FFFF 10FFFF 10FFFF 10FFFF 10FFFF 10FFFF 10FFFF
Code unit size 8 bits 16 bits 16 bits 16 bits 32 bits 32 bits 32 bits
Byte order N/A big-endian little-endian big-endian little-endian
Minimal bytes/character 1 2 2 2 4 4 4
Maximal bytes/character 4 4 4 4 4 4 4

今天在UltraEdit-32 v13中看到文本文件可以选择各种编码形式,其中UTF-16有很多种UTF-16、UTF-16 - NO BOM、UTF-16 - Big Endian、UTF-16 - Big Endian - NO BOM等数种,UTF-8也有UTF-8 - NO BOM。此外我在Java中看到“中国”的UTF-16编码为fe,ff,4e,2d,56,fd,而我查出来编码应该为4E2D,56FD,怎么会这样呢?
终于在上面这个表格中找到了答案。
 

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://www.unicode.org/faq/utf_bom.html#BOM
BOM是byte order marker的缩写,字节序有大端(big endian)和小端(little-endian),涉及多字节就有这样的问题。如果没有指定是BE还是LE的话,就需要BOM来指示。U+FEFF表示后面跟一个小端编码,否则是一个大端编码。这样Java的UTF-16结果就很好解释了,feff,表示是UTF-16大端编码。
Unicode ASCII Escaped表示下的“中国”变成了\u4E2D\u56FD,就是JDK中的那个工具native2ascii输出那样。