nan*_*nan 224 language-agnostic string unicode encoding
我对编码有点困惑.据我所知,旧的ASCII字符每个字符占用一个字节.Unicode字符需要多少字节?
我假设一个Unicode字符可以包含来自任何语言的每个可能的字符 - 我是否正确?那么每个字符需要多少字节?
UTF-7,UTF-6,UTF-16等是什么意思?它们是不同版本的Unicode吗?
pau*_*ago 182
奇怪的是,没有人指出如何计算一个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
Run Code Online (Sandbox Code Playgroud)
所以快速回答是:它需要1到4个字节,具体取决于第一个字节,它将指示它将占用多少字节.
正如prewett所指出的,此规则仅适用于UTF-8
Log*_*ldo 136
你不会看到一个简单的答案,因为没有一个答案.
首先,Unicode不包含"来自每种语言的每个字符",尽管它肯定会尝试.
Unicode本身是一个映射,它定义了代码点,而代码点是一个数字,通常与一个字符相关联.我说通常是因为有像组合字符这样的概念.你可能熟悉口音或变音符号之类的东西.这些可以与另一个角色一起使用,例如a a
或a u
来创建新的逻辑角色.因此,字符可以包含1个或多个代码点.
为了在计算系统中有用,我们需要为这些信息选择一种表示.这些是各种unicode编码,例如utf-8,utf-16le,utf-32等.它们的主要区别在于它们的代码单元的大小.UTF-32是最简单的编码,它有一个32位的代码单元,这意味着一个单独的代码点可以很好地适应代码单元.其他编码将具有码点将需要多个代码单元的情况,或者根本不能在编码中表示特定代码点(例如,对于UCS-2来说这是一个问题).
由于组合字符的灵活性,即使在给定的编码中,每个字符的字节数也可以根据字符和规范化形式而变化.这是一个用于处理具有多个表示的字符的协议(可以说"an 'a' with an accent"
哪个是2个代码点,其中一个是组合字符,或者"accented 'a'"
是一个代码点).
bas*_*ic6 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
©
®
?
—
‰
€
™
?
?
?
?
?
?
?
?
?
?
好的,我被带走了......
有趣的事实:
Zim*_*bao 28
简单来说,它Unicode
是一个为世界上所有角色分配一个数字(称为代码点)的标准(它仍在进行中).
现在,您需要使用字节来表示此代码点,即调用它们character encoding
.UTF-8, UTF-16, UTF-6
是表示这些角色的方式.
UTF-8
是多字节字符编码.字符可以有1到6个字节(其中一些可能现在不需要).
UTF-32
每个字符有4个字节的字符.
UTF-16
每个字符使用16位,它只代表称为BMP的Unicode字符的一部分(出于所有实际目的,它足够了).Java在其字符串中使用此编码.
Joh*_*ohn 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
Run Code Online (Sandbox Code Playgroud)
在UTF-16中:
2 bytes: 0 - D7FF (multilingual plane except the top 1792 and private-use )
4 bytes: D800 - 10FFFF
Run Code Online (Sandbox Code Playgroud)
在UTF-32中:
4 bytes: 0 - 10FFFF
Run Code Online (Sandbox Code Playgroud)
根据定义,10FFFF是最后一个unicode代码点,它的定义是因为它是UTF-16的技术限制.
它也是UTF-8可以编码为4字节的最大码点,但UTF-8编码背后的思想也适用于5和6字节编码,以覆盖代码点,直到7FFFFFFF,即.UTF-32可以的一半.
在Unicode中,答案不容易给出.正如您已经指出的那样,问题是编码.
给定没有变音字符的任何英语句子,UTF-8的答案将是字符的字节数,对于UTF-16,它将是字符数乘以2.
唯一的编码(截至目前)我们可以做出关于大小的声明是UTF-32.在那里它每个字符总是32位,即使我想象代码点是为未来的UTF-64准备的:)
让它变得如此困难至少有两件事:
U+20AC
可以表示为三字节序列E2 82 AC
或四字节序列F0 82 82 AC
.有一个很好的工具来计算UTF-8中任何字符串的字节:http://mothereff.in/byte-counter
更新:@mathias公开了代码:https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
好吧,我也刚刚打开了维基百科页面,在介绍部分我看到“Unicode 可以通过不同的字符编码来实现。最常用的编码是 UTF-8(它对任何 ASCII 字符使用一个字节,其中有UTF-8 和 ASCII 编码中的代码值相同,其他字符最多为四个字节),现在已过时的 UCS-2(每个字符使用两个字节,但无法对当前 Unicode 标准中的每个字符进行编码)”
正如此引用所表明的,您的问题是您假设 Unicode 是编码字符的单一方式。实际上,Unicode 有多种形式,并且,再次引用该内容,其中一种甚至每个字符有 1 个字节,就像您习惯的那样。
所以你想要的简单答案是它会有所不同。
归档时间: |
|
查看次数: |
292603 次 |
最近记录: |