写作目的:字符编码是计算机技术的基础,想要提高工作效率,降低缺陷产生概率,就必须懂一点点字符编码知识。
一、ASCII码
产生背景:
我们知道,计算机只能处理0和1,任何符号都转换为0和1的序列才能处理。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。
ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。
不足:
ASCII码只解决了英文编码问题,没有解决其他国家语言编码问题。
随着计算机的发展和互联网的发展,不同国家,地区都在使用计算机;每个国家都有自己的语言,如中国有中文,法国使用法语等。ASCII只能表示128个字符,英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。
二、GB2312
产生背景:
ASCII码只解决了英文编码问题,没有解决其他国家语言编码问题,每个国家符号数量都不一样,就各自指定了自己的编码。例如我们中国就制定了GB2312编码,GB2312编码用2个字节表示一个字符。
不足:
虽然中文有了自己的编码:GB2312,但是其他国家也有自己的语言编码,与其他国家进行通信交流时,编码格式和含义不一致,会造成乱码,没法交流。
三、Unicode
产生背景:
Unicode编码的产生,就是为了解决多种编码乱码问题
不足:
容易造成存储的极大浪费
们已经知道,英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
四、UTF-8
产生背景:
解决了Unicode存储浪费问题,需要说明的是:UTF-8 是 Unicode 的实现方式之一。
不足:
目前被广泛使用
五、decode与encode
decode英文意思是 解码,encode英文原意 编码
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码, 即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。