一.前言
在学习python初期,常常会对运行文件出现的各种"codec"报错摸不着头脑有没有?
对各种编码方式的区别和适用的情况混淆有没有?
对python2,python3 编码区别傻傻分不清有没有?
编码转换出错,页面出现乱码等等问题分析不清楚,就很容易掉坑里。。。
本文通过深入理解字符串存储,显示,和传输时候使用不同编码方式的原因,对python编码有关的问题来进一步加深理解。
二.什么是字符集?
字符集是一个抽象的概念,它与编码无关,比如英文字符,数字标点,中文字符,这些都可以称之为字符集
三.什么是编码?
编码的本质其实就是翻译,举个几个例子:
- 两个说普通话的中国人进行交流时,是不需要编码的,一个人说「你好」,另一个就能直接听明白意思,反之亦然。
- 一个中国人和美国人交流时,就需要多一个中文到英文、和英文到中文的翻译过程,才能实现双向交流。
- 一个人类和计算机交流时,也是一样的道理,大家都知道计算机只认识二进制0和1,因此必须把人类语言转为二进制,才能把信息传递给计算机,这个过程叫做编码(encoding),反之则称为解码(decoding)。
四. 怎么编码?
ASCII
美国信息交换标准代码(American Standard Code for Information Interchange,简称ASCII)是一种用于信息交换的美国标准代码,它的作用是给英文字母、数字、标点、字符转换成计算机能识别的二进制数规定了一个大家都认可并遵守的标准。(因为是美国人设计的,所以只有常用英文字符)
ASCII表太小了,最多只能编码128个字符,但人类语言又那么多,显然无法满足需求,于是世界各地的人们就分别设计了符合自己语言需求的映射表。
- GB2312编码
适用于汉字处理、汉字通信等系统之间的信息交换。
- GBK编码
是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码。(GBK包含GB2312的同时,又 增加了近20000个新的汉字,有生僻字。)
- ANSI(扩展的ASCII编码)
与你使用的windows操作系统的语言有关系的,向windows 7 简体中文版就是GBK(用一个字节表示英文,用两个字节表 示一个中文)。
- Big5
繁体字(香港台湾)
以上各种编码方式,在自己的地区使用时是没有问题的,但是一旦进行国际交流,由于映射规则各不相同,就会导致混乱。
于是人们设计了一个很大的映射表——
Unicode编码
这是一种世界上所有字符的编码,但是它没有规定的存储方式。
范围:0x000000-0x10FFFF(十六进制),有110多万
现代操作系统和大多数编程语言都直接支持Unicode。
Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。
比如“中”的unicode编码为十六进制0x4E2D,需要用两个字节来表示,有些字符可能需要3个甚至4个字节来表示,如果都采用定长编码,就会造成存储空间的极大浪费,因为我们知道英文字符只需要一个字节就能表示,于是便有了对unicode的不同实现方案,目前最广泛使用的就是utf-8