【Unicode与UTF-8的关系】
Unicode是“字符集”
UTF-8是“编码规则”
字符集就像一张表格,每一个字符都有自己固定的位置(码位);编码规则就是把字符的位置转换成计算机能处理的二进制序列。字符集unicode是固定唯一的,但是编码的方式却有很多(utf8、utf16、utf32等)。
【utf8】
以 8 位为一个单位的可变长编码,灵活运用 1~4个字节来存储不同的字符:
0000~007F | 1个字节 | 0XXXXXXX |
0080~07FF | 2个字节 | 110XXXXX 10XXXXXX |
0800~FFFF | 3个字节 | 1110XXXX 10XXXXXX 10XXXXXX |
10000~1FFFF | 4个字节 | 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX |
utf8作为可变长的编码,编码前面的数字(0、110、1110、11110)代表了这个字符用了多少字节表示。utf8虽然解决了兼容性问题(比如ASCII中英文字母用一个字节编码,utf8也是用一个字节),但是却带来了大量冗余。
比如两个字节中,其实只剩11位来编码字符。字符“汉”的码位是27721,大于2的11次方(2048),所以要用3个字节编码;而用utf16编码的话是01101100 01001001,只要2个字节。
【utf16】
所有字符统一用16位表示,也就是2个字节,能表示65536个字符。
缺点是字符边界不易区分(丢失一位的话),而且unicode字符数量已经超出216了。
【utf32】
所有字符统一用32位表示,每个字符都要4个字节,是非常浪费空间的。
【国标系列】gbk、gb2312、gb18030
他们是中国人民对ASCII编码无法支持汉字显示这一问题的解决方案(原有ASCII编码格式的映射不变,额外加上汉字编码)。一个英文字母占一个字节,一个汉字占2个字节。