Unicode编码也可称为万能码,它将世界上所有的符号都使用2或4个字节(即2的16/32次方)来表示,每个字符的二进制表示长度固定为16/32位,如此确实可以兼容所有的字符编码,但是4个字节的长度造成了存储容量的极大浪费,许多常用的字符往往只需要一个字节(如ASCII美国信息交换标准代码),于是utf-8编码应运而生,**它本质上是对Unicode编码的一个压缩**。
以4个字节的ucs4为例,一个字符无论其十六进制表示的值大小,都需要4个字节来存储。而utf-8则利用这一点,根据码值范围来决定编码占用的字节数,具体对应方式如下所示:
unicode码值范围 | utf-8字节数 | 转化模板 |
---|---|---|
0000--007F | 1个字节 | 0XXXXXXX |
0080--07FF | 2个字节 | 110XXXXX 10XXXXXX |
0800--FFFF | 3个字节 | 1110XXXX 10XXXXXX 10XXXXXX |
10000--10FFFF | 4个字节 | 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX |
那么具体的转换过程是什么呢,我们来举一个例子:
- B对应的unicode码为0x0042,因此应该按照第一个行的模板来转化,即把B的unicode码的后七位映射到X上,就得到01000010
- 木对应的unicode码为0x6728,因此应该按照第三个行的模板转化,即把16位的0110011100101000映射到16个X上,得到11100110 10011100 10101000
其余的字符依此类推,如果位数不够就在前面补0.
从这里也可以看到,为什么中文utf-8表示大多是三个字节?因为unicode编码中中文码值范围就是0800--FFFF,转化的时候应用第三个模板,即三个字节。