字符集与字符编码
想要弄明白文本的编码是怎么回事,绕不过去字符集和字符编码这两个概念。
字符集
说白了就是某些特定字符的集合,如果把世界上不同国家文明的所有字符都放在一起组成一个集合,那么我们常见的 ASCII、GB2312、GBK、GB18030字符集都只是包含了该集合的一部分而已。而 Unicode 字符集是可以包含所有国家文明中的所有字符的。
字符编码
所有的文件在计算机中最终是以二进制序列来保存的,不同的序列就可以表示不同的内容。字符编码的目的就是对不同的字符编码设计合理的唯一二进制序列在计算机中进行存储表示。
我们知道,字节是计算机中对二进制序列表达最常用的单位,一字节的长度是8位,能够表达256种不同的状态,也就是256个不同的字符。
字符编码发展史
ASCII 码(American Standard Code for Information Interchange:美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。 前128个为常用的字符如运算符,字母,数字等,后 128个为特殊字符,不能存中文。
后来有了GB2312编码,虽然它能够覆盖大部分高使用频率的汉字,毕竟还是有无法编码的字存在。GBK 的出现弥补了少数汉字无法进行编码解析的问题,收录了两万多个中文字符它是 GB2312 编码的扩展,向下兼容 GB2312,同时包含了繁体字。
然而我汉语博大精深,两万多个字符也无法满足我们的需求了。GB18030进一步扩展了 GBK 所包含的字符集范围,甚至还包含少数民族文字。同时也是向下兼容 GBK、GB2312的。
但是,很多传统的编码方式都有一个共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况)。为了统一所有文字的编码,Unicode应运而生。
Unicode(统一码、万国码)把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。事实证明,对可以用 ASCII 表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF-8。
UTF-8是对Unicode的压缩和优化,其特点是对不同范围的字符使用不同长度的编码。它不再使用最少2个字节,而是将所有的字符和符号进行分类:ASCII 码内容用1个字节保存,欧洲字符用2个字节保存,中文字符用3个字节保存……
Python字符编码格式
python2.x 默认使用ASCII编码格式
python3.x 默认使用UTF-8编码格式
字符编码转换
UTF-8转成GBK:
(1)首先解码(decode)为UNICODE编码
(2)然后编码(encode)为GBK编码
GBK转成UTF-8:
(1)首先解码(decode)为UNICODE编码
(2)然后编码(encode)为UTF-8编码
- END -