Unicode
概述
class-001.jpg
- 字符集
- 代码点
- 仅与字符集相关,与编码方式无关
- 字符集中代表字符的那个数字编号;A:U+0041
- Unicode代码点可以分为17个代码级别
- 第一个代码级别称为基本的多语言级别,代码点从U+0000到U+FFFF,其中包括了经典的Unicode代码
- 其余的16个附加级别,代码点从U+10000到U+10FFFF,包括了一些增补字符
- 代码单元
- 与编码方式有关
- 可以理解为字符编码的一个基本单元,比如UTF-8是1个字节,UTF-16是2个字节
- 增补字符
- 16位编码的所有65536个字符不能完全表示全世界所有正在使用或曾经使用的字符
- Unicode标准已扩展到包含多达1112064个字符
- 超出原来16位限制的字符被称作增补字符
- U+0000至U+FFFF之间的字符集被称为基本多语言面(BMP Basic Multilingual Plane)
- 每一个Unicode字符要么属于BMP,要么属于增补字符
UCS-4
- 如果UCS-4的前两个字节为全零,那么去掉前面的两个零字节就得到了UCS-2
- 根据最高位为0的最高字节分成2^7=128个group
- 每个group再根据次高字节分为256个平面(plane)
- 每个平面根据第3个字节分为256行(row)
- 每个平面有2^16=65536个码位,即每行256个码位(cell)
- Unicode计划使用了17个平面,一共有17×65536=1114112个码位
- 在Unicode5.0.0版本中,已定义的码位只有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16
- 其中平面15和平面16上只是定义了两个各占65534个码位的专用区(Private Use Area),分别是0xF0000-0xFFFFD和0x100000-0x10FFFD
- 所谓专用区,就是保留给大家放自定义字符的区域,可以简写为PUA
- group 0的平面0被称作BMP(Basic Multilingual Plane)
- 平面0也有一个专用区:0xE000-0xF8FF,有6400个码位
- 平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域
- 代理区目的在于使用两个UTF-16字符表示BMP以外的字符
- 如前所述在Unicode 5.0.0版本中,238605-65534*2-6400-2048=99089
- 余下的99089个已定义码位分布在平面0、平面1、平面2和平面14上,其中包括71226个汉字
- 52080 + 3419 + 43253 + 337
- 平面2的43253个字符都是汉字
- 平面0上定义了27973个汉字
- Unicode中:汉字“字”对应的数字是23383(十进制),十六进制表示为5B57
- Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32
UTF
概述
- Unicode Transformation Format,Unicode字符集转换格式,即将Unicode定义的数字转换成程序数据
UTF-8
// Unicode编码 UTF-8字节流
00000000 - 0000007F 0xxxxxxx
00000080 - 000007FF 110xxxxx 10xxxxxx
00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000 - 03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
04000000 - 7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
- UTF-8编码最大长度是6个字节,6字节模板有31个x,可容纳31位二进制数字
- 与Unicode的最大码位0x7FFFFFFF相对应
UTF-16
- 以16位无符号整数为单位
- 我们把Unicode字符记作U,编码规则如下
- 如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数(为书写简便,下文将16位无符号整数记作WORD)
- 如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx
- U的UTF-16编码就是:1101 10yy yyyy yyyy 1101 11xx xxxx xxxx
- 为什么U'可以被写成20个二进制位?
- Unicode的最大码位是0x10ffff,减去0x10000后,U'的最大值是0xfffff,所以肯定可以用20个二进制位表示
- 例如:Unicode字符0x20C30
- 减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000
- 用前10位依次替代模板中的y,用后10位依次替代模板中的x
- 得到:11011000 01000011 11011100 00110000
- 即0xD843 0xDC30
UTF-32
- 以32位无符号整数为单位,Unicode的UTF-32编码就是其对应的32位无符号整数
网友评论