Unicode编码
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
Unicode用数字0x000000-0x10FFFF来映射字符,最多可以容纳1114112个字符。UTF-8、UTF-16、UTF-32都是将数字转换为程序数据的实现方案。
Unicode计划使用17个平面,每个平面有2^16=65536个码位,一共有17*65536=1114112个码位。
Unicode 5.0.0版本中,已经定义的码位有238605个,分布在平面0、平面1、平面2、平面14、平面15、平面16。
平面15和平面16只是定义了两个各占65534个码位的专用区,分别是0xF0000-0xFFFFD和0x100000-0x10FFFD。所谓专用区,就是保留给大家放自定义字符的区域。
平面0也有一个专用区:0xE000-0xF8FF,有6400个码位。
平面0的0xD800-0xDFFF,共2048个码位,被称作代理区。代理区的目的是用两个UTF-16字符表示BMP以外的字符。UTF-16编码时会介绍。
Unicode 5.0.0版本中,238605-65534*2-6400-2408=99089。余下的99089个已定义码位分布在平面0、平面1、平面2和平面14上,它们对应着Unicode定义的99089个字符,其中包括71226个汉字。
平面0、平面1、平面2和平面14上分别定义了52080、3419、43253和337个字符。平面2的43253个字符都是汉字。平面0上定义了27973个汉字。
UTF-16编码
Unicode转换为UTF-16
UTF-16转换为Unicode
UTF-8编码
UTF-8是一种变长字节编码方式。
对于一个字符的UTF-8编码,如果只有一个字节,则其最高二进制位为0;如果是多个字节,第一个字节从最高位开始连续的二进制位值为1的个数决定了其编码的字节数,后续字节均以10开头。UTF-8编码最多可使用到6个字节进行编码。
| 字节数 | 编码格式 | UTF-8 | Unicode |
|---|---|---|---|
| 1字节 | 0xxxxxxx | 0x00~0x7F | U+0000~U+007F |
| 2字节 | 110xxxxx 10xxxxxx | 0xC2~0xDF 0x80~0xBF |
U+0080~U+07FF |
| 3字节 | 1110xxxx 10xxxxxx 10xxxxxx | 0xE0 0xA0~0xBF 0x80~0xBF 0xE1~0xEC 0x80-0xBF 0x80-0xBF 0xED 0x80~0x9F0 0x80-0xBF 0xEE~0xEF 0x80-0xBF 0x80-0xBF |
U+0800~U+FFFF |
| 4字节 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 0xF0 0x90~0xBF 0x80-0xBF 0x80-0xBF 0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF 0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF |
U+10000~U+10FFFF |
| 5字节 | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 未定义 | 未定义 |
| 6字节 | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 未定义 | 未定义 |
UTF-8中可以用来表示字符编码的实际位数最多有31位,即上表中x所表示的位。这些x表示的位与Unicode编码是一一对应的,位高低的顺序也是相同的。
当前Unicode编码只定义了21位,所以,5字节和6字节处于未定义状态。


