Unicode编码系统可分为编码方式和实现方式两个层次。
1.编码方式
通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。
UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个平面(plane)。每个平面根据第3个字节分为256行 (row),每行有256个码位(cell)。group 0的平面0被称作BMP(Basic Multilingual Plane)。将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。每个平面有2^16=65536个码位。
Unicode计划使用了17个平面,一共17*65536=1114112个码位。
2.实现方式
UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。
2.1 UTF-8
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
2.2 UTF-16
UTF-16编码以2个字节为单位。我们把Unicode编码记作U。编码规则如下:
如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数
如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。故Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,也就是4字节。
为什么U'可以被写成20个二进制位?Unicode的最大码位是0x10ffff,减去0x10000后,U'的最大值是0xfffff,所以肯定可以用20个二进制位表示。
2.3 UTF-32
UTF-32编码以4个字节为单位。Unicode的UTF-32编码就是其对应的32位无符号整数。
总结起来,可以这样理解UTF-8/16/32,UTF-16是最初的Unicode编码形式,其原理类似DBCS,但是显然2个字节并不能够将全世界语言完全编码;于是乎,UTF-32出现了,4字节的编码肯定是足够了,但是用着用着发现,有很多字符的编码其高位都是0,太浪费空间;于是乎UTF-8和UTF-16变异体出现了,其原理类似于MBCS,即使用变长字节对字符进行编码。