为什么要搞清楚各种字符编码的原理及差异
- 解决程序乱码问题
- 优化文件存储空间
- 优化网络传输流量消耗
以下是总结的一些常见字符编码的介绍:
编码类型 | 字节数 | 年代 | 编码原理 | 字符集 | 缺点 | 备注 |
---|---|---|---|---|---|---|
ASCII | 1 | 1967 | 从0~127来表示所有英文字符和一些符号 其中0x20以下的字节状态称为“控制码”(例如换行) | 英文文字、符号及控制码 | 只包含128个字符 | 是最早的字符编码 由美国国家标准学会(ANSI)制定 |
GB2312 | 1 2 | 1980 | 一个小于127的字符的意义与原来相同 但两个大于127的字符连在一起时,就表示一个汉字 | 6763常用汉字、数学符号、罗马字符、ASCII所有字符(半角字符)、ASCII中所有字符重新编码后占2个字节的字符(全角字符)等 | 不包含繁体字 | GB2312 是对 ASCII 的中文扩展 英文只占1个字节,中文占2个字节 |
BIG-5 | 2 | 1984 | 双字节编码,高字节编码范围是0x81-0xFE,低字节编码范围是0x40-0x7E和0xA1-0xFE。 0x8140-0xA0FE是保留区域,用于用户造字区。 | 13053个中文字、408个字符以及33个控制 | 只包括繁体汉字,不包括简体汉字,一些生僻的汉字也没有收录 | 通行于台湾、香港地区的一个繁体字编码方案。 是我国早期中文电脑的业界标准,也是中文社群最常用的电子汉字字集标准 |
Unicode | 2 | 1994 | 鉴于1个字节无法表示所有的字符,于是扩展到2个字节,最多可表示6万多个字符 ASCII中的所有字符维持不变,将长度由8位增加到16位,高位补0 其他语言的字符全部重新统一编码 | 全球统一字符标准 | ASCII中字符的高8位永远是0,存储空间比ASCII大一倍 | 所有字符都用2个字节表示 |
UTF-8 | 1-4可变 | 1992 | 对不同范围的字符使用不同长度的编码: 1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同; 2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。 | 一种针对Unicode的可变长度字符编码,又称“万国码”。 UTF-8就是每次1个字节(8个位)传输数据 | 中文汉字所占字节数较大 | 常用中文字符用utf-8编码占用3个字节(大约2万多字) 但超大字符集中的更大多数汉字要占4个字节(在unicode编码体系中,U+20000开始有5万多汉字) |
GBK | 1 2 | 1995 | 在GB2312的基础上,不再要求低字节大于127 只要第一个字节是大于127就固定表示这是一个汉字的开始 | GBK包括了GB2312的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号 收录了所有Unicode 1.1及GB 13000.1-93之中的汉字 | 未包含少数民族的字符 | 英文只占1个字节,中文占2个字节 根据西方资料,GBK最初是由微软对GB2312的扩展,并用在win95上 |
GB18030 | 1 2 4 | 2000 2005 | GBK基础上增加了CJK统一汉字扩充A的汉字 | 包含了GBK的所有内容,同时增加了几千个少数民族的字符 其中4字节部分收录了双字节字符之外的包括CJK统一汉字扩充A在内的GB13000.1 中的全部字符。 | 英文只占1个字节,中文占2个字节 |
总结
- ASCII字符集所用字节数最少,只有1个字节,但只包含英文字符
- GB系列的字符集都为不定长字符集,英文字符为1个字节,中文字符占2个字节
- Unicode字符集为定长字符集,所有字符均为2个字节
- UTF-8字符集为可变长度字符集,英文字符占1个字节,常用中文字符占3个字节
由于UTF-8中文字符所占用的空间为3个及以上的字符,这也是为什么在互联网如此发达的今天,UTF-8几乎成为业内标准,GB2312、GBK等编码方式在国内仍然被广泛使用的原因