为什么Unicode限制为0x10FFFF?

时间:2018-09-06 11:43:54

标签: unicode character-encoding range codepoint

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

1 个答案:

答案 0 :(得分:3)

这是因为UTF-16。 BMP之外的字符用UTF-16中的surrogate pair表示,第一个代码单元位于 0xD800-0xDBFF 之间,第二个代码单元位于 0xDC00-0xDFFF 之间。每个CU代表代码点的10位,从而允许总共 20位的数据(0x100000个字符)被拆分为 16个平面(16×2 16 字符)。其余的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 3629对Unicode进行了限制,以匹配UTF-16编码的限制:明确禁止大于U + 10FFFF的代码点(以及通过U + DFFF的高低代换U + D800)。这个有限的子集定义了UTF-32

     

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

您可以阅读this more detailed answer