【问题标题】:Total number of UTF16 CharactersUTF16 字符总数
【发布时间】:2011-06-26 10:15:33
【问题描述】:

你能计算出一个 UTF16 编码通过排列/组合表示 1,112,064 个数字吗?

【问题讨论】:

  • 请展开:就目前而言,它没有意义。
  • 对于 UTF-8,已知可以表示 2^31 个可能的字符。我在想如果你应用这个公式来计算可能的 UTF-16 字符数。
  • 会有 2^16 种可能性吗?
  • 但 UTF-8 不代表 2^31 个可能的字符。 31 位表示 2^31 个可能的字符,但 UTF-8 并未按照规范 (RFC 3629) 涵盖所有 31 位。说它确实是错误的,如果有一个字符使用超出指定范围的值编码,它就不是 UTF-8。
  • 不要将代码点与字符混淆。 U+FFFF 不是字符; U+D800 也不是。但两者都是代码点。它们只是不适用于交换。

标签: unicode character-encoding utf-16


【解决方案1】:

UNICODE 标准是第 3.9 节说:

每种编码形式都将 Unicode 代码点 U+0000..U+D7FF 和 U+E000..U+10FFFF 映射到唯一的代码单元序列。

因此 UTF-16 可以表示的代码点(“字符”)的数量是

0xD7FF + 1 + (0x10FFFF - 0xE000) + 1 = 1 112 064

UNICODE 标准通常是 32 位的。但是,特定编码保留了较少的位来表示最常见的字符,这对它们可以合法表示的实际字符数施加了特定的限制。为了允许更长的位序列,进而允许描述比 8 (UTF-8) 或 16 (UTF-16) 位更长的代码点,定义了特殊的代理代码点。

此外,能够表示给定编码中的给定代码点并不意味着它是有效的——它必须首先由 UNICODE 标准分配和描述。因此,没有数学公式可以得出可以表示的字符数,而数字 1 112 064 并不一定意味着有 1M 有效字符。

有关详细讨论,请参阅 UNICODE 标准的section 3.9

【讨论】:

    【解决方案2】:

    UTF-16 编码单元共有三种:

    • 高代理项(U+D800 到 U+DBFF)。其中有 1024 个。
    • 低代理(U+DC00 到 U+DFFF)。其中有 1024 个。
    • BMP 中可直接表示的字符。其中有 65536-2*1024=63488 个。

    有 1024×1024 = 1,048,576 可以通过代理表示(“补充字符”U+10000 到 U+10FFFF)。在 BMP 中添加 63,488 个可表示字符,得到 1,112,064。

    【讨论】:

      【解决方案3】:

      您可以在 UTF-16 中表示 1112064 个标量值,因为标准第 3.9 节中的定义 D76 定义了 1112064 个标量值,并且因为 UTF-16 编码形式(与所有 Unicode 编码形式一样)是唯一的表示形式定义 D79 中定义的所有 Unicode 标量值。

      D76Unicode 标量值: 除高代理和低代理代码点之外的任何 Unicode 代码点。

      • 作为此定义的结果,Unicode 标量值集由 0 到 D7FF 和 E000 到 10FFFF 的范围组成。

      D79Unicode 编码形式 将每个 Unicode 标量值分配给唯一的代码单元序列。

      当然,由于定义 D91 中列出的代理对编码机制,这些数字并不是完全任意的。鉴于表 3-5 中的位分布,没有办法对高于 10FFFF 的标​​量值进行编码。

      【讨论】:

        【解决方案4】:

        在这里查看答案https://stackoverflow.com/questions/280182/

        它几乎和规范一样好,嗯,它结合了一些规范。我会引用:

        UTF-16 是可变长度代码;它的字符消耗 2 或 4 个字节。 0xD800-0xDFFF 范围内的 2 字节值保留用于构造 4 字节字符,所有 4 字节字符由 0xD800-0xDBFF 范围内的两个字节和 0xDC00-0xDFFF 范围内的 2 个字节组成。因此,Unicode 不会分配 U+D800-U+DFFF 范围内的任何字符。

        UTF-16 的容量:1,112,064

        【讨论】:

        • 虽然代理不是字符,但它们确实是代码点。由于 UTF-16 问题,它们根本不适用于交换。但你必须能够在内部代表它们。
        【解决方案5】:

        没有。 UTF-16 表示的字符数只能通过规范知道,不能通过数学知道。 UTF-16 是人们制定的一组特定编码规则,而不是某些公式的固有属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-18
          • 2011-06-06
          • 1970-01-01
          • 1970-01-01
          • 2017-11-23
          • 1970-01-01
          • 2012-09-01
          • 1970-01-01
          相关资源
          最近更新 更多