Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 一个Unicode字符需要多少字节?_String_Language Agnostic_Unicode_Encoding - Fatal编程技术网

String 一个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

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

我假设一个Unicode字符可以包含任何语言中所有可能的字符,对吗?那么每个字符需要多少字节呢

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


我读了这本书,但对我来说很难。我期待着看到一个简单的答案。

我也在上面打开了维基百科页面,在介绍部分我看到了“Unicode可以通过不同的字符编码实现。最常用的编码是UTF-8(任何ASCII字符使用一个字节,在UTF-8和ASCII编码中具有相同的代码值,其他字符最多使用四个字节),现已过时的UCS-2(每个字符使用两个字节,但不能在当前的Unicode标准中对每个字符进行编码)

正如这段引文所示,您的问题在于,您假设Unicode是一种编码字符的单一方式。实际上,Unicode有多种形式,在这段引文中,其中一种甚至与您习惯的情况一样,每个字符有1个字节


因此,您想要的简单答案是它是不同的。

在Unicode中,答案不容易给出。正如您已经指出的,问题在于编码

如果任何英语句子没有变音字符,UTF-8的答案将是字符的字节数,而UTF-16的答案将是字符数乘以2

到目前为止,我们唯一可以声明大小的编码是UTF-32。在这里,每个字符总是32位,尽管我认为代码点已经为未来的UTF-64做好了准备:)

让它如此困难的至少有两件事:

  • 组合字符,其中用户决定将重音和基本字符(`a)组合起来,而不是使用已加重音/变音(À)的字符实体
  • 代码点。代码点是UTF编码允许编码的比特数超过其名称通常允许的比特数的方法。例如,UTF-8指定某些字节,这些字节本身无效,但当后跟有效的连续字节时,将允许描述超出8位范围0..255的字符。请参阅下面关于UTF-8的维基百科文章中的和超长编码。
    • 这里给出的一个很好的例子是,欧元字符(代码点
      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