为什么Unicode被限制为0x10FFFF? [英] Why is Unicode restricted to 0x10FFFF?

查看:64
本文介绍了为什么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=0x10FFFF

Unicode Character Encoding Stability Policies保证以上的代码点永远不会被赋值

General_Category属性值代理(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月,RFC3629对Unicode进行了限制,以匹配UTF-16编码的约束:明确禁止大于U+10FFFF的代码点(以及高和低替代U+D800到U+DFFF)。此有限子集定义UTF-32

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

您可以阅读this more detailed answer

这篇关于为什么Unicode被限制为0x10FFFF?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆