String 一个Unicode字符需要多少字节?
我对编码有点困惑。据我所知,旧的ASCII字符每个字符占用一个字节。一个Unicode字符需要多少字节 我假设一个Unicode字符可以包含任何语言中所有可能的字符,对吗?那么每个字符需要多少字节呢 UTF-7、UTF-6、UTF-16等是什么意思?它们是Unicode的不同版本吗String 一个Unicode字符需要多少字节?,string,language-agnostic,unicode,encoding,String,Language Agnostic,Unicode,Encoding,我对编码有点困惑。据我所知,旧的ASCII字符每个字符占用一个字节。一个Unicode字符需要多少字节 我假设一个Unicode字符可以包含任何语言中所有可能的字符,对吗?那么每个字符需要多少字节呢 UTF-7、UTF-6、UTF-16等是什么意思?它们是Unicode的不同版本吗 我读了这本书,但对我来说很难。我期待着看到一个简单的答案。我也在上面打开了维基百科页面,在介绍部分我看到了“Unicode可以通过不同的字符编码实现。最常用的编码是UTF-8(任何ASCII字符使用一个字节,在UTF
我读了这本书,但对我来说很难。我期待着看到一个简单的答案。我也在上面打开了维基百科页面,在介绍部分我看到了“Unicode可以通过不同的字符编码实现。最常用的编码是UTF-8(任何ASCII字符使用一个字节,在UTF-8和ASCII编码中具有相同的代码值,其他字符最多使用四个字节),现已过时的UCS-2(每个字符使用两个字节,但不能在当前的Unicode标准中对每个字符进行编码) 正如这段引文所示,您的问题在于,您假设Unicode是一种编码字符的单一方式。实际上,Unicode有多种形式,在这段引文中,其中一种甚至与您习惯的情况一样,每个字符有1个字节
因此,您想要的简单答案是它是不同的。在Unicode中,答案不容易给出。正如您已经指出的,问题在于编码 如果任何英语句子没有变音字符,UTF-8的答案将是字符的字节数,而UTF-16的答案将是字符数乘以2 到目前为止,我们唯一可以声明大小的编码是UTF-32。在这里,每个字符总是32位,尽管我认为代码点已经为未来的UTF-64做好了准备:) 让它如此困难的至少有两件事:
- 这里给出的一个很好的例子是,欧元字符(代码点
可以表示为三字节序列U+20AC
或四字节序列E2 82 AC
F0 82 AC
- 这两种方法都是有效的,这表明当谈论“Unicode”而不是Unicode的特定编码(如UTF-8或UTF-16)时,答案是多么复杂
简单地说,
Unicode
是一种为世界上所有字符分配一个数字(称为代码点)的标准(其工作仍在进行中)
现在您需要使用字节来表示这些代码点,这被称为字符编码UTF-8、UTF-16、UTF-6
是表示这些字符的方法
UTF-8
是多字节字符编码。字符可以有1到6个字节(其中一些现在可能不需要)
UTF-32
每个字符有4个字节和一个字符
UTF-16
对每个字符使用16位,它只表示一部分称为BMP的Unicode字符(就所有实际用途而言,已经足够了)。Java在其字符串中使用这种编码。您将看不到简单的答案,因为没有简单的答案
首先,Unicode并不包含“每种语言的每一个字符”,尽管它确实尝试过
Unicode本身是一种映射,它定义了码点,码点是一个数字,通常与一个字符相关联。我之所以这样说,通常是因为有一些概念,比如组合字符。你可能熟悉重音或umlauts。这些可以与另一个字符一起使用,例如a
或u
,以创建新的字符逻辑字符。因此,一个字符可以由1个或多个代码点组成
为了在计算系统中有用,我们需要为这些信息选择一种表示形式。这些是各种unicode编码,如utf-8、utf-16le、utf-32等。它们的主要区别在于它们的代码单元的大小。utf-32是最简单的编码,它有一个32位的代码单元,这意味着单个代码点适合com其他编码会出现这样的情况:一个代码点需要多个代码单元,或者该特定代码点根本无法在编码中表示(这是UCS-2的一个问题)
由于组合字符的灵活性,即使在给定的编码中,每个字符的字节数也可能因字符和规范化形式而异。这是一种用于处理具有多个表示形式的字符的协议(可以说是带有重音的“a”)
是两个码点,其中一个是组合字符或“重音'a'”
是一个码点)。有一个很好的工具可以计算UTF-8中任何字符串的字节:
更新:@mathias已公开代码:检查此项。例如,输入
0x2009
,其中,在“0x…表示法”字段中,单击转换。十六进制数E2 80 89
(3字节)显示在“UTF-8代码单位”中字段。我知道这个问题很老,而且已经有了公认的答案,但我想举几个例子(希望对其他人有用)
据我所知,旧的ASCII字符每个字符占用一个字节
对。实际上,由于ASCII是一种7位编码,它支持128个代码(95
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
[0xD800 - 0xDBFF] [0xDC00 - 0xDFF]
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
2 bytes: 0 - D7FF (multilingual plane except the top 1792 and private-use )
4 bytes: D800 - 10FFFF
4 bytes: 0 - 10FFFF