Unicode与UTF-8的区别
Unicode是一个字符集,为了保证全球各个国家的字符都能有唯一的二进制码。
UTF-8 是 Unicode 字符集的一种编码实现方式,比如:
字符 | Unicode | UTF-8 |
A | 00000000 01000001 (16进制:0041 ) | 01000001 |
中 | 01001110 00101101 (16进制:4E2D ) | 11100100 10111000 10101101 |
那么疑问来了,Unicode已经统一了全球字符,为啥还需要UTF-8呢?
我们说Unicode字符“通常”只有2个字节,但Unicode的字节长度是可以扩展的,以支持那些还未出生的字符(如果将来发现火星上也有人类并且想和我们交流),因此在编码时,单纯地使用Unicode字符集的原始值,就会出现在解码的时候,不知道一次得截取几个字节来翻译成字符,比如6个字节的字符串,它到底是几个字符呢,可能3个,也可能2个。
于是乎,在使用Unicode字符集时,采取一种策略来支持可变长度字节的识别就成了一个刚需,这个时候UTF-8这种编码方式就粉墨登场了,基于Unicode字符集,通过特殊的“前缀码”来规定一个字符需要占用几个字节,恰好这个策略也完美兼容了单字节的Ascii码。
Unicode —>UTF-8 转换的规则如下:
Unicode(16进制) | UTF-8 字节流(2进制) |
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 |
字符“A” 的16进制为0041,在00000000 - 0000007F区间,所以编码之后为1个字节。
字符“中”的16进制为4E2D,在00000800 - 0000FFFF区间,所以编码之后为3个字节。
假如解码时,遇到以下字节串:
01000001 11100100 10111000 10101101
对于UTF-8来说,是这样完成的:
1,按顺序,先遇到第1个字节01000001,因为第1位二进制码是0,于是根据规则,断定当前字符的编码是1个字节,然后取出Unicode值1000001,翻译出字符“A”;
2,接着走,再遇到第2个字节11100100,因为前4位二进制码是1110,于是根据规则断定当前字符的编码是3个字节,匹配 1110xxxx 10xxxxxx 10xxxxxx后,取出Unicode值为 01001110 00101101,翻译出字符“中”;