为什么Unicode被限制为0x10FFFF?

问题描述 投票:2回答:1

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

unicode character-encoding range codepoint
1个回答
3
投票

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

因此,字符总数为0x100000 + 0xFFFF = 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月,RFC受到RFC 3629的限制,以匹配UTF-16编码的约束:明确禁止大于U + 10FFFF的代码点(以及高和低代理U + D800到U + DFFF)。这个有限的子集定义了UTF-32

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

你可以阅读this more detailed answer

© www.soinside.com 2019 - 2024. All rights reserved.