常见编码方式
ASCll码
统一规定了英文字符与二进制位之间的关系,一共规定了128个字符的编码
Unicode
是一种所有符号的编码,将世界上所有的符号都纳入其中
存在的问题是,Unicode只是一个符号集,只规定了符号的二进制代码,没有规定这个二进制代码该如何储存。为了解决这个问题,就有了Unicode的三种实现方式:UTF-8,UTF-16,UTF-32
UTF-8
它是一种可变长度的编码方式,可以用1~4个字节表示一个符号,根据不同的符号变化字节长度
编码规则:
1.对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英文字母,UTF-8和ASCll码是相同的
2.对于n字节的符号,第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,其余的二进制位用这个字符的Unicode码点来填充(从后向前填充,不够的用0补上)
十进制 | Unicode | UTF-8 |
---|---|---|
0-127 | 0x000000-0x00007F | 0xxxxxxx(7位) |
128-2047位 | 0x000080-0x0007FF | 110xxxxx 10xxxxxx(11位) |
2048-65535位 | 0x000800-0x00FFFF | 1110xxxx 10xxxxxx 10xxxxxx(16位) |
65536-1114111位 | 0x010000-0x10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx(21位) |
UTF-16
Unicode编码点分为17个平面(plane),每个平面包含216(即65536)个码位(code point),而第一个平面称为“基本多语言平面”(Basic Multilingual Plane,简称BMP),其余平面称为“辅助平面”(Supplementary Planes)。其中“基本多语言平面”(00xFFFF)中0xD8000xDFFF之间的码位作为保留,未使用。
UTF-16同时结合了定长和变长两种编码方法的特点。他的编码规则很简单:基本平面的字符占用2个字节,辅助平面的字符占用4个字节。也就是说,UTF-16的编码长度要么是2个字节,要么是4个字节
十进制 | Unicode | UTF-16 |
---|---|---|
0-65535位 | 0x00000-0x00FFFF | xxxxxxxx xxxxxxxx(16位) |
65536-1114111位 | 0x010000-0x10FFFF | 110110yy yyyyyyyy 110111xx xxxxxxxx(20位) |
与UTF-8相比虽然表示的方法简单方便,有很大一部分字符用一个字节就可以表示的现在要用两个字节表示,有占有的存储空间放大一倍,会增大网络传输的流量,而且没必要这么做。
GBK
是GB2312的扩展,是向上兼容的,GB2312(国标码)中的汉字编码与GBK中汉字的相同。另外,GBK还包含繁体字的编码