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

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

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

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


当前回答

有一个很好的工具可以计算UTF-8中任何字符串的字节数:http://mothereff.in/byte-counter

更新:@mathias已公开代码:https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js

其他回答

有一个很好的工具可以计算UTF-8中任何字符串的字节数:http://mothereff.in/byte-counter

更新:@mathias已公开代码:https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js

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

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

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

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

Unicode是一种为每个字符提供唯一编号的标准。这些唯一的数字被称为代码点(这只是唯一的代码),适用于世界上所有存在的字符(有些字符还有待添加)。

出于不同的目的,您可能需要用字节表示这些代码点(大多数编程语言都是这样做的),这就是字符编码发挥作用的地方。

UTF-8、UTF-16、UTF-32等等都是字符编码,Unicode的码位以不同的方式在这些编码中表示。

UTF-8编码具有可变宽度长度,其中编码的字符可以占用1到4个字节(包括);

UTF-16具有可变长度,其中编码的字符可以占用1或2个字节(即8或16位)。这只代表了称为BMP(基本多语言平面)的所有Unicode字符的一部分,对于几乎所有的情况都足够了。Java对其字符串和字符使用UTF-16编码;

UTF-32有固定的长度,每个字符正好占用4个字节(32位)。

简单地说,Unicode是一种为世界上所有字符分配一个数字(称为码位)的标准(它仍在进行中)。

现在你需要用字节表示这些代码点,这叫做字符编码。UTF-8, UTF-16, UTF-6是表示这些字符的方法。

UTF-8是多字节字符编码。字符可以有1到6个字节(其中一些现在可能不需要)。

UTF-32每个字符有4个字节一个字符。

UTF-16为每个字符使用16位,它只表示称为BMP的Unicode字符的一部分(对于所有实际目的来说已经足够了)。Java在其字符串中使用这种编码。

在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的一半。