历史
Unicode标准规定U+D800~U+DFFF的值不对应于任何字符。之所以这样做,是为了UTF-16。
一开始的时候,Unicode是被设计成用固定的16位来表示代码点的。那时也被称作UCS-2时代。很自然,这些代码点上的值就直接不经过任何变换,直接作为UTF-16的编码了。后来,人们发现两个字节不足以表达世界上所有的书写系统,所以Unicode又被扩充为了4个字节,但是实际上只用了21位。也就是0x0000~0x10FFFF。此时,进入了UCS-4时代。
UTF-16
这时,如果还想继续使用UTF-16表达除了BMP平面之外的字符,就要进行一些改进了。之就引入了代理对的概念。引入代理对,是为了表示BMP平面之外的字符,也就是0x10000~0x10FFFF上的字符。对于表示BMP平面上的字符,UTF-16还是使用2个字节,对于表示BMP平面之外的字符,则使用4个字节。顾名思义,UTF-16是以16位递增的,2字节,4字节。
1.对于BMP平面上的字符,其代码点的值就是其UTF-16的值,此时字符占用2个字节;
2.对于BMP平面之外的字符,要用代理对儿,进行转换即可,此时字符占用4个字节。
代理对
下面我们来看一下什么是代理对。这就要用到前面讲到的保留区U+