我对编码有点困惑。据我所知,旧的ASCII字符每个字符占用一个字节。Unicode字符需要多少字节?
我假设一个Unicode字符可以包含来自任何语言的所有可能的字符-我说的对吗?那么每个字符需要多少字节呢?
UTF-7、UTF-6、UTF-16等是什么意思?它们是不同版本的Unicode吗?
我读过Wikipedia article about Unicode,但它对我来说很难。我期待着看到一个简单的答案。
好吧,我也打开了维基百科的页面,在介绍部分我看到了"Unicode可以由不同的字符编码实现。最常用的编码是UTF-8 (它对任何ASCII字符使用一个字节,它在UTF-8和ASCII编码中具有相同的代码值,最多四个字节用于其他字符),现在已经过时的UCS-2 (它对每个字符使用两个字节,但不能在当前Unicode标准中对每个字符进行编码)“。
正如这段引述所示,您的问题在于您假设Unicode是一种单一的字符编码方式。实际上,Unicode有多种形式,在这句话中,其中一种甚至每个字符都有一个字节,就像你习惯的那样。
所以你想要的简单答案是它是不同的。
简单地说,Unicode
是一个标准,它将一个数字(称为代码点)分配给世界上所有的字符(它还在开发中)。
现在你需要用字节来表示这个代码点,这就是character encoding
。UTF-8, UTF-16, UTF-6
是表示这些字符的方式。
UTF-8
是多字节字符编码。字符可以有1到6个字节(其中一些现在可能不需要)。
UTF-32
每个字符都有4个字节的字符。
UTF-16
对每个字符使用16位,并且它只表示称为BMP的Unicode字符的一部分(对于所有实际目的,它已经足够了)。Java在其字符串中使用此编码。
在UTF-8中有一个强大的工具可以计算任何字符串的字节数:http://mothereff.in/byte-counter
更新:@mathias已经公开了代码:https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
看看这个Unicode code converter。例如,在"0x... notation“字段中输入0x2009
,其中2009 is the Unicode number for thin space,然后单击Convert。十六进制数字E2 80 89
(3字节)出现在"UTF-8 code unit“字段中。
奇怪的是,没有人指出如何计算一个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个字节,这取决于第一个字节,它将指示它将占用多少字节。
对于UTF-16,如果字符以0xD800或更大的字符开头,则需要四个字节(两个代码单元);这样的字符称为“代理对”。更具体地说,代理项对的形式如下:
[0xD800 - 0xDBFF] [0xDC00 - 0xDFF]
哪里..。表示给定范围内的双字节代码单元。任何<= 0xD7FF都是一个代码单元(两个字节)。任何>= 0xE000都是无效的(有争议的是,BOM标记除外)。
请参阅http://unicodebook.readthedocs.io/unicode_encodings.html,7.5节。
在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的一半。
Unicode
是一个standard,它为每个字符提供一个唯一的数字。对于世界上存在的所有字符,这些唯一的数字被称为code point
s (这只是一个唯一的代码)(一些字符还在添加中)。
出于不同的目的,您可能需要用字节来表示这个code points
(大多数编程语言都是这样做的),这就是Character Encoding
的用武之地。
UTF-8
、UTF-16
、UTF-32
等都是Character Encodings
,并且Unicode的代码点在这些编码中以不同的方式表示。
UTF-8
编码具有可变宽度长度,其中编码的字符可以占用1到4个字节;
UTF-16
具有可变长度,其中编码的字符可以采用1或2个字节(即8或16位)。这只表示所有称为BMP (基本多语言平面)的Unicode字符的一部分,对于几乎所有情况都足够了。Java的字符串和字符使用UTF-16
编码;
UTF-32
具有固定的长度,每个字符恰好占用4个字节(32位)。