code point: 码位
code unit:码元
UTF-16
UTF-16 (16-bit Unicode Transformation Format) 是Unicode字符编码五层次模型的第三层:字符编码表(Character Encoding Form,也称为"storage format")的一种实现方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。
Unicode的编码空间从U+0000到U+10FFFF,共有1,112,064个码位(code point)可用来映射字符。Unicode的编码空间可以划分为17个平面(plane),每个平面包含216(65,536)个码位。17个平面的码位可表示为从U+xx0000到U+xxFFFF,其中xx表示十六进制值从00(16进制)到10(16进制),共计17个平面。第一个平面称为基本多语言平面(Basic Multilingual Plane, BMP),或称第零平面(Plane 0)。其他平面称为辅助平面(Supplementary Planes)。基本多语言平面内,从U+D800到U+DFFF之间的码位区块是永久保留不映射到Unicode字符。UTF-16就利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。
编码规则
U+0000 ~ U+D7FF 和 U+E000 ~ U+FFFF
这个范围即基本多语言平面(Basic Multilingual Plane, BMP),包含了最常用的字符,包含的码位范围是U+0000 到 U+FFFF,只需要一个16位的码元即可表示。
U+10000 ~ U+10FFFF
其它平面(叫做辅助平面,Supplementary Planes)中的码位,在UTF-16中被编码为一对16位长的码元(即32bit,4Bytes),称作代理对(surrogate pair),具体方法是:
- 码位(0x10000~0x10FFFF)减去0x10000(BMP范围),剩下20比特长的数字,范围是0..0xFFFFF。
- 高位的10比特(数值范围为0..0x03FF)被加上0xD800得到第一个16位长的码元或称作高位代理(high surrogate),值的范围是0xD800..0xDBFF。
- 低位的10比特的值(值的范围也是0..0x3FF)被加上0xDC00得到第二个16位长的码元或称作低位代理(low surrogate),现在值的范围是0xDC00..0xDFFF。
由于高位代理比低位代理的值要小,所以为了避免混淆使用,Unicode标准现在称高位代理为前导代理(lead surrogates),低位代理为后尾代理(trail surrogates)。
上述算法可理解为:辅助平面中的码位从U+10000到U+10FFFF,共计FFFFF个,即2^20=1,048,576个,需要20位来表示。如果用两个16位长的整数组成的序列来表示,第一个整数(称为前导代理)要容纳上述20位的前10位,第二个整数(称为后尾代理)容纳上述20位的后10位。还要能根据16位整数的值直接判明属于前导整数代理的值的范围(2^10=1024),还是后尾整数代理的值的范围(也是2^10=1024)。因此,需要在基本多语言平面中保留不对应于Unicode字符的2048个码位,就足以容纳前导代理与后尾代理所需要的编码空间。这对于基本多语言平面总计65536个码位来说,仅占3.125%.
由于前导代理、后尾代理、BMP中的有效字符的码位,三者互不重叠,搜索是简单的:一个字符编码的一部分不可能与另一个字符编码的不同部分相重叠。这意味着UTF-16是自同步(self-synchronizing):可以通过仅检查一个码元就可以判定给定字符的下一个字符的起始码元。UTF-8也有类似优点,但许多早期的编码模式就不是这样,必须从头开始分析文本才能确定不同字符的码元的边界。
U+D800 ~ U+DFFF
Unicode标准规定U+D800..U+DFFF的值不对应于任何字符。
但是在使用UCS-2的时代,U+D800..U+DFFF内的值被占用,用于某些字符的映射。
UTF-16与UCS-2的关系
UTF-16来源于UCS-2 。在1980年代末,人们希望为世界上所有字符(Universal Character Set--UCS)开发一个统一的编码。最初的目标是扩展8位的ascii码为16位比特(216 = 65,536)。可惜,很快16位被证明不足够包括所有字符,共同开发UCS的IEEE和Unicode Consortium产生分歧:IEEE引入固定32位比特来编码字符(UCS-4),Unicode Consortium推出UTF-16。
UTF-16可看成是UCS-2的父集。在没有辅助平面字符(surrogate code points)前,UTF-16与UCS-2所指的是同一的意思。但当引入辅助平面字符后,就称为UTF-16了。现在若有软件声称自己支持UCS-2编码,那其实是暗指它不能支持在UTF-16中超过2字节的字集。对于小于0x10000的UCS码,UTF-16编码就等于UCS码。
- 共 1 页
- 1
[3, 15, 8, 29, 102, 22].sort(new Function(
a
,b
,b-a
))第 43 题:使用 sort() 对数组 [3, 15, 8, 29, 102, 22] 进行排序,输出结果