我对编码有点困惑。据我所知,旧的ASCII字符每个字符占用一个字节。一个Unicode字符需要多少字节?

我假设一个Unicode字符可以包含任何语言的所有可能字符——我说的对吗?那么每个字符需要多少字节呢?

UTF-7、UTF-6、UTF-16等是什么意思?它们是Unicode的不同版本吗?

我读了维基百科上关于统一码的文章,但对我来说太难了。我期待看到一个简单的答案。


当前回答

对于UTF-16,如果字符以0xD800或更大开头,则需要四个字节(两个代码单元);这样的字符称为“代理对”。更具体地说,代理对的形式是:

[0xD800 - 0xDBFF]  [0xDC00 - 0xDFF]

在[…]表示给定范围的双字节代码单元。任何<= 0xD7FF的值都是一个代码单元(两个字节)。任何>= 0xE000都是无效的(BOM标记除外)。

参见http://unicodebook.readthedocs.io/unicode_encodings.html,第7.5节。

其他回答

奇怪的是,没有人指出如何计算一个Unicode字符占用多少字节。下面是UTF-8编码字符串的规则:

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation byte: one of 1-3 bytes following the first
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF7   First byte of a 4-byte character encoding

所以简单的答案是:它需要1到4个字节,这取决于第一个将表明它将占用多少字节。

看看这个Unicode代码转换器。例如,在“0x…”字段,然后单击Convert。十六进制数E2 80 89(3字节)出现在“UTF-8 code units”字段中。

在utf - 8:

1 byte:       0 -     7F     (ASCII)
2 bytes:     80 -    7FF     (all European plus some Middle Eastern)
3 bytes:    800 -   FFFF     (multilingual plane incl. the top 1792 and private-use)
4 bytes:  10000 - 10FFFF

在utf - 16:

2 bytes:      0 -   D7FF     (multilingual plane except the top 1792 and private-use )
4 bytes:   D800 - 10FFFF

在utf - 32:

4 bytes:      0 - 10FFFF

根据定义,10FFFF是最后一个unicode码位,这样定义是因为它是UTF-16的技术限制。

它也是UTF-8可以在4字节内编码的最大码点,但UTF-8编码背后的思想也适用于5字节和6字节编码,以覆盖码点,直到7FFFFFFF。只有UTF-32的一半。

对于UTF-16,如果字符以0xD800或更大开头,则需要四个字节(两个代码单元);这样的字符称为“代理对”。更具体地说,代理对的形式是:

[0xD800 - 0xDBFF]  [0xDC00 - 0xDFF]

在[…]表示给定范围的双字节代码单元。任何<= 0xD7FF的值都是一个代码单元(两个字节)。任何>= 0xE000都是无效的(BOM标记除外)。

参见http://unicodebook.readthedocs.io/unicode_encodings.html,第7.5节。

从维基:

UTF-8, 8位可变宽度编码,最大限度地兼容ASCII; UTF-16,一种16位变宽编码; UTF-32, 32位,固定宽度编码。

这是三种最流行的不同编码。

在UTF-8中,每个字符被编码成1到4个字节(主要编码) 在UTF16中,每个字符被编码成1到2个16位的单词和 在UTF-32中,每个字符都被编码为一个32位的单词。