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输出那样。