为什么Unicode被限制为0x10FFFF? [英] Why is Unicode restricted to 0x10FFFF?
本文介绍了为什么Unicode被限制为0x10FFFF?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
为什么最大Unicode码位限制为0x10FFFF?是否可以通过任何编码方案(如UTF-16、UTF-8)表示此代码点以上的Unicode(例如0x10FFFF+0x000001=0x110000)?
推荐答案
是因为utf-16。基础多语种平面之外的字符在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=0x10FFFFUnicode Character Encoding Stability Policies保证以上的代码点永远不会被赋值
从历史上看,UTF-8允许up to U+7FFFFFFF using 6 bytes,而UTF-32可以存储两倍的数量。但是,由于UTF-16的限制,Unicode委员会决定UTF-8永远不能超过4个字节,从而导致与UTF-16的范围相同General_Category属性值代理(Cs)是不可变的:具有该值的代码点集永远不会更改。
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月,RFC3629对Unicode进行了限制,以匹配UTF-16编码的约束:明确禁止大于U+10FFFF的代码点(以及高和低替代U+D800到U+DFFF)。此有限子集定义UTF-32
您可以阅读this more detailed answer和
- Do UTF-8, UTF-16, and UTF-32 differ in the number of characters they can store?
- Does the Unicode Consortium Intend to make UTF-16 run out of characters?
- How many characters can be mapped with Unicode?
- Proposal to restrict the range of code positions to the values up to U-0010FFFF
这篇关于为什么Unicode被限制为0x10FFFF?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文