我对编码感到有点困惑。据我所知,旧的ASCII字符每个字符占用一个字节。 Unicode字符需要多少字节?
我假设一个Unicode字符可以包含来自任何语言的每个可能的字符 - 我是否正确?那么每个字符需要多少字节?
UTF-7,UTF-6,UTF-16等是什么意思?它们是不同版本的Unicode吗?
我读了Wikipedia article about Unicode,但这对我来说很难。我期待看到一个简单的答案。
答案 0 :(得分:164)
奇怪的是,没有人指出如何计算占用一个Unicode字符的字节数。以下是UTF-8编码字符串的规则:
Vector3.down
所以快速回答是:它需要1到4个字节,具体取决于第一个字节,它将指示它将占用多少字节。
正如 prewett 所指出的,此规则仅适用于UTF-8
答案 1 :(得分:129)
你不会看到简单的答案,因为没有答案。
首先,Unicode不包含“来自每种语言的每个字符”,尽管它肯定会尝试。
Unicode本身是一个映射,它定义了代码点,代码点是一个数字,与通常一个字符相关联。我说通常是因为有像组合字符这样的概念。你可能熟悉口音或变音符号之类的东西。这些可以与其他角色一起使用,例如a
或u
来创建新的逻辑角色。因此,字符可以包含1个或多个代码点。
为了在计算系统中有用,我们需要为这些信息选择一种表示。这些是各种unicode编码,例如utf-8,utf-16le,utf-32等。它们的主要区别在于它们的代码单元的大小。 UTF-32是最简单的编码,它有一个32位的代码单元,这意味着一个单独的代码点可以很好地适应代码单元。其他编码将有一种情况,其中代码点将需要多个代码单元,或者根本不能在编码中表示特定代码点(例如,这是UCS-2的问题)。
由于组合字符的灵活性,即使在给定的编码中,每个字符的字节数也可以根据字符和规范化形式而变化。这是一个处理具有多个表示的字符的协议(您可以说"an 'a' with an accent"
是2个代码点,其中一个是组合字符或"accented 'a'"
,它是一个代码点。
答案 2 :(得分:36)
我知道这个问题已经过时并且已经有了接受的答案,但我想提供一些例子(希望它对某人有用)。
据我所知,旧的ASCII字符每个字符占用一个字节。
右。实际上,由于ASCII是7位编码,它支持128个代码(其中95个是可打印的),所以它只使用半个字节(如果这有意义的话)。
Unicode字符需要多少字节?
Unicode只是将字符映射到代码点。它没有定义如何编码它们。文本文件不包含Unicode字符,但可以包含可能表示Unicode字符的字节/八位字节。
我假设一个Unicode字符可以包含所有可能的字符 来自任何语言的人物 - 我是否正确?
没有。但是几乎。所以基本上是的。但仍然没有。
那么每个字符需要多少字节?
与第二个问题相同。
UTF-7,UTF-6,UTF-16等是什么意思?它们是某种Unicode吗? 版本
不,那些是编码。它们定义字节/八位字节应如何表示Unicode字符。
几个例子。如果其中一些无法在浏览器中显示(可能是因为字体不支持它们),请转到http://codepoints.net/U+1F6AA
(用十六进制代码点替换1F6AA
)以查看图像。
a
©
®
ጷ
—
‰
€
™
☃
☎
☔
☺
⚑
⚛
✈
✞
〠
肉
好的,我被带走......
有趣的事实:
答案 3 :(得分:27)
简单地说Unicode
是一个为世界上所有角色分配一个数字(称为代码点)的标准(它仍在进行中)。
现在您需要使用字节来表示此代码点,即名为character encoding
的字节。 UTF-8, UTF-16, UTF-6
是表示这些角色的方式。
UTF-8
是多字节字符编码。字符可以有1到6个字节(其中一些可能现在不需要)。
UTF-32
每个字符有4个字节的字符。
UTF-16
每个字符使用16位,它只代表一部分称为BMP的Unicode字符(实际用途就足够了)。 Java在其字符串中使用此编码。
答案 4 :(得分:13)
在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的一半。
答案 5 :(得分:8)
在Unicode中,答案并不容易。正如您已经指出的那样,问题是编码。
鉴于任何没有变音字符的英语句子,UTF-8的答案将是字符的字节数,对于UTF-16,它将是字符数乘以2。
唯一的编码(截至目前)我们可以对大小进行声明是UTF-32。在那里它每个字符总是32位,即使我想象代码点是为未来的UTF-64准备的:)
至关重要的是至少有两件事:
U+20AC
可以表示为三字节序列E2 82 AC
或四字节< / strong> sequence F0 82 82 AC
。答案 6 :(得分:7)
有一个很棒的工具可以计算UTF-8中任何字符串的字节:http://mothereff.in/byte-counter
更新:@mathias公开了代码:https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
答案 7 :(得分:4)
我刚刚在它上面打开了维基百科页面,在介绍部分我看到“Unicode可以通过不同的字符编码实现。最常用的编码是UTF-8(对任何ASCII字符使用一个字节) ,UTF-8和ASCII编码具有相同的代码值,其他字符的代码值最多为4个字节),现在过时的UCS-2(每个字符使用两个字节但不能编码当前Unicode中的每个字符)标)“
正如此引文所示,您的问题是您假设Unicode是一种编码字符的单一方式。实际上有多种形式的Unicode,并且在该引用中,其中一个甚至每个字符有1个字节,就像你习惯的那样。
所以你想要的简单答案就是变化。
答案 8 :(得分:3)
对于UTF-16,如果字符以0xD800或更高开头,则该字符需要四个字节(两个代码单元);这样的角色被称为代理对。&#34;更具体地说,代理对具有以下形式:
[0xD800 - 0xDBFF] [0xDC00 - 0xDFF]
其中[...]表示具有给定范围的双字节代码单元。任何&lt; = 0xD7FF是一个代码单元(两个字节)。任何&gt; = 0xE000都无效(可以说是BOM标记除外)。
请参阅http://unicodebook.readthedocs.io/unicode_encodings.html,第7.5节。
答案 9 :(得分:2)
Unicode
是standard,它为每个字符提供唯一的数字。这些唯一的数字被称为code point
(这是唯一的代码),用于世界上所有存在的字符(有些字符仍要添加)。
出于不同的目的,您可能需要用字节表示此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位)。
答案 10 :(得分:1)
查看此Unicode code converter。例如,在“0x ...表示法”字段中输入0x2009
,其中2009 is the Unicode number for thin space,然后单击转换。十六进制数E2 80 89
(3个字节)出现在“UTF-8代码单元”字段中。
答案 11 :(得分:0)
来自Wiki:
UTF-8,一种8位可变宽度编码,可最大程度地提高与ASCII的兼容性;
UTF-16,一种16位可变宽度编码;
UTF-32,一种32位固定宽度编码。
这是三种最流行的不同编码。