【发布时间】:2019-02-11 16:11:38
【问题描述】:
为什么最大 Unicode 码位限制为 0x10FFFF?是否可以在此代码点上方表示 Unicode - 例如0x10FFFF + 0x000001 = 0x110000 - 通过任何编码方案,如 UTF-16、UTF-8?
【问题讨论】:
标签: unicode character-encoding range codepoint
为什么最大 Unicode 码位限制为 0x10FFFF?是否可以在此代码点上方表示 Unicode - 例如0x10FFFF + 0x000001 = 0x110000 - 通过任何编码方案,如 UTF-16、UTF-8?
【问题讨论】:
标签: unicode character-encoding range codepoint
这是因为 UTF-16。 基本多语言平面 (BMP) 之外的字符在 UTF-16 中使用 surrogate pair 表示,第一个代码单元 (CU) 位于 0xD800–0xDBFF 和 0xDC00–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% 以上的四字节序列被删除字节序列以及所有五字节和六字节序列。
同样适用于 UTF-32
2003 年 11 月,Unicode 受到 RFC 3629 的限制,以匹配 UTF-16 编码的约束:明确禁止大于 U+10FFFF 的代码点(以及从 U+D800 到 U+DFFF 的高位和低位代理)。这个有限的子集定义了 UTF-32
【讨论】: