Unicode
unicode是固定长度的字符集,最初由两个字节共16位表示。16位最多只能表示65536个字符。当需要表示各种语言的所有字符时,16位是不够用的。所以unicode4.0新增了一组附加字符集,附加字符集采用两个16位(注意,不是32位)来表示,最多可定义1048576个附加字符。
注意,unicode只是一组理论上的字符集。如果要在内存或者文件中表示字符,需要使用一定的编码方式来表示unicode。 utf-8就是unicode的一种实现编码规范。
utf-8
unicode算上附加字符集,需要使用两个字节以上的二进制来表示,姑且认为需要使用3个字节。而英文采用ASCII码,只需要使用一个字节。如果将一个ASCII码的文件用unicode来表示,文件大小将增加3倍,这是无法接受的。但是,一定要使用unicode,因为unicode定义了世界各个语言的字符,全世界通用,这也是unicode的初衷。于是一个合适的编码实现就非常重要。utf-8应运而生。
utf-8是变字节编码,根据unicode值,其实现可能为1、2、3、4……个字节。utf-8的每个字节的第一位都是1. 假设utf-8需要使用n个字节表示,第一个字节的前n位为1,n+1位为0,其他字节的前两位为10.其他位为unicode的映射位。
unicode 与 utf-8的对应关系
unicode utf-8
0x00000000 - 0x0000007F 1xxxxxxx
0x00000080 - 0x000007FF 110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxx
0x04000000 - 0x7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxx 10xxxxxx
utf-8中的所有x就是unicode的值。
总结utf-8字节数与unicode有效位数的关系:
1字节 —— 1-7
2字节 —— 8-11
3字节 ——9-16
4字节 ——17-21
5字节 ——22-26
6字节 ——27-31
所以,根据unicode的有效位数就能知道utf-8的字节数。
所以,根据unicode的有效位数就能知道utf-8的字节数。
例如:汉字‘刘’的unicode值位:01010010 0001 1000
有效位数为15位,因此对应的utf-8为3个字节
utf-8为:11100101 10001000 10011000
即E58898.