一个Unicode字符占用多少字节?

时间:2011-03-13 15:02:38

标签: string language-agnostic unicode encoding

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

我假设一个Unicode字符可以包含来自任何语言的每个可能的字符 - 我是否正确?那么每个字符需要多少字节?

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

我读了Wikipedia article about Unicode,但这对我来说很难。我期待看到一个简单的答案。

12 个答案:

答案 0 :(得分:164)

奇怪的是,没有人指出如何计算占用一个Unicode字符的字节数。以下是UTF-8编码字符串的规则:

Vector3.down

所以快速回答是:它需要1到4个字节,具体取决于第一个字节,它将指示它将占用多少字节。

更新

正如 prewett 所指出的,此规则仅适用于UTF-8

答案 1 :(得分:129)

你不会看到简单的答案,因为没有答案。

首先,Unicode不包含“来自每种语言的每个字符”,尽管它肯定会尝试。

Unicode本身是一个映射,它定义了代码点,代码点是一个数字,与通常一个字符相关联。我说通常是因为有像组合字符这样的概念。你可能熟悉口音或变音符号之类的东西。这些可以与其他角色一起使用,例如au来创建新的逻辑角色。因此,字符可以包含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)以查看图像。

    • U + 0061 LATIN SMALL LETTER A:a
      • Nº:97
      • UTF-8:61
      • UTF-16:00 61
    • U + 00A9版权标志:©
      • Nº:169
      • UTF-8:C2 A9
      • UTF-16:00 A9
    • U + 00AE注册号:®
      • Nº:174
      • UTF-8:C2 AE
      • UTF-16:00 AE
    • U + 1337 ETHIOPIC SYLLABLE PHWA:
      • Nº:4919
      • UTF-8:E1 8C B7
      • UTF-16:13 37
    • U + 2014 EM DASH:
      • Nº:8212
      • UTF-8:E2 80 94
      • UTF-16:20 14
    • U + 2030 PER MILLE SIGN:
      • Nº:8240
      • UTF-8:E2 80 B0
      • UTF-16:20 30
    • U + 20AC EURO SIGN:
      • Nº:8364
      • UTF-8:E2 82 AC
      • UTF-16:20 AC
    • U + 2122商标标志:
      • Nº:8482
      • UTF-8:E2 84 A2
      • UTF-16:21 22
    • U + 2603 SNOWMAN:
      • Nº:9731
      • UTF-8:E2 98 83
      • UTF-16:26 03
    • U + 260E BLACK TELEPHONE:
      • Nº:9742
      • UTF-8:E2 98 8E
      • UTF-16:26 0E
    • U + 2614 UMBRELLA with RAIN DROPS:
      • Nº:9748
      • UTF-8:E2 98 94
      • UTF-16:26 14
    • U + 263A WHITE SMILING FACE:
      • Nº:9786
      • UTF-8:E2 98 BA
      • UTF-16:26 3A
    • U + 2691 BLACK FLAG:
      • Nº:9873
      • UTF-8:E2 9A 91
      • UTF-16:26 91
    • U + 269B ATOM SYMBOL:
      • Nº:9883
      • UTF-8:E2 9A 9B
      • UTF-16:26 9B
    • U + 2708 AIRPLANE:
      • Nº:9992
      • UTF-8:E2 9C 88
      • UTF-16:27 08
    • U + 271E阴影白色拉丁:
      • Nº:10014
      • UTF-8:E2 9C 9E
      • UTF-16:27 1E
    • U + 3020邮戳面:
      • Nº:12320
      • UTF-8:E3 80 A0
      • UTF-16:30 20
    • U + 8089 CJK UNIFIED IDEOGRAPH-8089:
      • Nº:32905
      • UTF-8:E8 82 89
      • UTF-16:80 89
    • U + 1F4A9 POO POO:
      • Nº:128169
      • UTF-8:F0 9F 92 A9
      • UTF-16:D8 3D DC A9
    • U + 1F680 ROCKET:
      • Nº:128640
      • UTF-8:F0 9F 9A 80
      • UTF-16:D8 3D DE 80
  1. 好的,我被带走......

    有趣的事实:

答案 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准备的:)

至关重要的是至少有两件事:

  1. 组成字符,而不是使用已经加音/变音符号(À)的字符实体,用户决定组合重音符号和基本字符(“A”)。
  2. 代码点。代码点是UTF编码允许编码的方法,而不是为其提供名称通常允许的位数。例如。 UTF-8指定某些字节,这些字节本身是无效的,但是当后跟有效的连续字节时,将允许描述超出8位范围0..255的字符。请参阅维基百科关于UTF-8的文章中的Examples和Overlong Encodings。
    • 给出的优秀示例是,€字符(代码点U+20AC可以表示为三字节序列E2 82 AC四字节< / strong> sequence F0 82 82 AC
    • 两者都有效,这表明在讨论“Unicode”时答案是多么复杂,而不是关于Unicode的特定编码,例如UTF-8或UTF-16。

答案 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)

Unicodestandard,它为每个字符提供唯一的数字。这些唯一的数字被称为code point(这是唯一的代码),用于世界上所有存在的字符(有些字符仍要添加)。

出于不同的目的,您可能需要用字节表示此code points(大多数编程语言是用字节表示),这里是Character Encoding的插入位置。

UTF-8UTF-16UTF-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位固定宽度编码。

这是三种最流行的不同编码。

  • 在UTF-8中,每个字符都被编码为1到4个字节(主要编码)
  • 在UTF16中,每个字符都被编码为1至2个16位字,并且
  • 在UTF-32中,每个字符都被编码为单个32位单词。