【问题标题】:Why is Unicode restricted to 0x10FFFF?为什么 Unicode 被限制为 0x10FFFF?
【发布时间】:2019-02-11 16:11:38
【问题描述】:

为什么最大 Unicode 码位限制为 0x10FFFF?是否可以在此代码点上方表示 Unicode - 例如0x10FFFF + 0x000001 = 0x110000 - 通过任何编码方案,如 UTF-16、UTF-8?

【问题讨论】:

    标签: unicode character-encoding range codepoint


    【解决方案1】:

    这是因为 UTF-16。 基本多语言平面 (BMP) 之外的字符在 UTF-16 中使用 surrogate pair 表示,第一个代码单元 (CU) 位于 0xD800–0xDBFF0xDC00–0xDFFF 之间的第二个。每个 CU 代表 10 位代码点,允许总共 20 位 数据(0x100000 个字符)被分成 16 个平面(16×216 个字符)。剩余的 BMP 将代表 0x10000 个字符(代码点 0-0xFFFF)

    因此,字符总数为 17×216 = 0x100000 + 0x10000 = 0x110000,这允许代码点从 0 到 0x110000 - 1 = 0x10FFFF。或者,最后一个可表示的代码点可以这样计算:BMP 中的代码点在 0–0xFFFF 范围内,因此用代理对编码的字符的偏移量是 0xFFFF + 1 = 0x10000,这意味着最后一个代码点代理对表示的是 0xFFFFF + 0x10000 = 0x10FFFF

    Unicode Character Encoding Stability Policies 保证上面的代码点将永远不会被分配

    General_Category 属性值 Surrogate (Cs) 是不可变的:具有该值的代码点集永远不会改变。

    从历史上看,UTF-8 允许up to U+7FFFFFFF using 6 bytes,而 UTF-32 可以存储两倍的数量。然而,由于 UTF-16 的限制,Unicode 委员会决定 UTF-8 不能超过 4 个字节,导致与 UTF-16 的范围相同

    2003 年 11 月,UTF-8 was restricted by RFC 3629 to match the constraints of the UTF-16 character encoding:明确禁止高低代理字符对应的码位删除超过 3% 的三字节序列,以 U+10FFFF 结尾的 48% 以上的四字节序列被删除字节序列以及所有五字节和六字节序列。

    https://en.wikipedia.org/wiki/UTF-8#History

    同样适用于 UTF-32

    2003 年 11 月,Unicode 受到 RFC 3629 的限制,以匹配 UTF-16 编码的约束:明确禁止大于 U+10FFFF 的代码点(以及从 U+D800 到 U+DFFF 的高位和低位代理)。这个有限的子集定义了 UTF-32

    https://en.wikipedia.org/wiki/UTF-32

    你可以阅读this more detailed answer

    【讨论】:

    • 致那些投反对票的人:如果有错误,发表评论是否太难了?
    • 我不知道谁投了反对票,但你的回答是错误的,但差距不大。 BMP 的范围在 0x0000-0xD7FF 到 0xE000-0xFFFF 之间。 BMP 中的字符以 UTF-16 的 1 个代码单元表示。当使用 2 个代码单元时,我们有 20 位来编码一个字符。因此,该集合具有 0 到 0xFFFFF 值。由于 Unicode 集中的这些值应该在 BMP 之后开始,其最后一个值为 0xFFFF。我们将 0x10000 添加到该集中的每个字符中,以便在 Unicode 字符集中正确索引。因此 0x10000 + 0xFFFFF = 0x10FFFF
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多