python基础——字符编码
一、什么是编码
编码是指信息从一种形式或格式转换为另一种形式或格式的过程。
在计算机中,编码,简而言之,就是将人能够读懂的信息(通常称为明文)转换为计算机能够读懂的信息。众所周知,计算机能够读懂的是高低电平,也就是二进制位(0,1组合)。
而解码,就是指将计算机的能够读懂的信息转换为人能够读懂的信息。
二、编码种类
- ASCII 占1个字节,只支持英文GB2312 占2个字节,支持6700+汉字
- GB2312 占2个字节,支持6700+汉字
- GBK GB2312的升级版,支持21000+汉字
- Shift-JIS 日本字符
- ks_c_5601-1987 韩国编码
- TIS-620 泰国编码
三、 Unicode的出现和演变
因为每个国家都有自己的一套的字符编码,当所制作的软件出到国外,软件无法正常显示,正是如此Unicode应运而生,它包含了全球的全部字符,称为万国码
Unicode主要起了两个作用:
- 支持全球的语言,统一编码。
- unicode包含了全球所有国家编码的映射关系
但是Unicode对于使用ACSII编码的软件不大友好,因为在ACSII编码中,一个英文字符只需要一个字节,而Unicode中需要两个字节才可以表示完,这样大大加大了在网络传输和储存的成本。
为了解决这个问题的出现,1992年出现了UTF-8(8-bit Unicode Transformation Format),节省网络传输和存储等节省空间
- UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。
-
UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
- UTF-32: 使用4个字节表示所有字符。
四、编码的转换
在出现Unicode和utf-8之前,每个国家都用着自己国家的编码,当Unicode和 utf-8出现后,我们并不能马上改变我们的代码,因为要改变的东西太多了,然后要让我们的软件被国外的使用,我们只有两条路可以走
- 让国外的每台电脑装上我们国家的gbk的编码
- 让我们的软件以utf-8编码
显然,第一条路不大好走,而第二种比较好实现。但是第二种只能针对新软件来操作,因为过去的软件已经再次以另一种方式操作会花费许多工程。但是我们可以把软件的数据从硬盘读到内存里,然后用Unicode表示,这样就可以解决问题了。
五、decode and encode
在Python2中,默认字符的编码就是ASCII,如果我们想写中文需要在文件头部添加#_*_coding:utf-8 *,这样去声明,但是我们即使在文件头部添加这个信息后,我们依然无法去读取,因为它只是以utf-8去解释我们的文件,加载到内存也还是utf-8.在windows上面的终端,我们读取也是乱码,我们windows是以Unicode和gbk显示的。
在Python3中,默认字符的编码是utf-8,我们Python3在文件解释时,把我们的文件的编码转为了Unicode,这样我们在终端就可以读取到,因此不会乱码。如果我们想要Python2成功的在我们的终端显示,我们就需要完成Python3偷偷为我们做的事。
UTF-8 --> decode 解码 --> Unicode Unicode --> encode 编码 --> GBK / UTF-8
decode:
encode
记住以下规则
验证编码转对
- 查看数据类型,python 2 里有专门的unicode 类型
- 查看unicode编码映射表
unicode字符是有专门的unicode类型来判断的,但是utf-8,gbk编码的字符都是str,你如果分辨出来的当前的字符串数据是何种编码的呢? 有人说可以通过字节长度判断,因为utf-8一个中文占3字节,gbk一个占2字节
上面只能大体判断,下面介绍准确方法
下面是 ‘编码’ 二字在Unicode映射表的位置
将其全部转为二进制
编 B 1 8 4 2 1 8 4 2 1 1 0 1 1 0 0 0 1 E 0 8 4 2 1 8 4 2 1 1 1 1 0 0 0 0 0 码 C 2 8 4 2 1 8 4 2 1 1 1 0 0 0 0 1 0 E B 8 4 2 1 8 4 2 1 1 1 1 0 1 0 1 1
这样依旧没有对上,但是我们需要把每个二进制的左边第一位全部变成0,发现最后加起来确实如此。
因为,GBK的编码表示形式决定的。。因为GBK编码在设计初期就考虑到了要兼容ASCII,即如果是英文,就用一个字节表示,2个字节就是中文,但如何区别连在一起的2个字节是代表2个英文字母,还是一个中文汉字呢? 中国人如此聪明,决定,2个字节连在一起,如果每个字节的第1位(也就是相当于128的那个2进制位)如果是1,就代表这是个中文,这个首位是128的字节被称为高字节。 也就是2个高字节连在一起,必然就是一个中文。 你怎么如此笃定?因为0-127已经表示了英文的绝大部分字符,128-255是ASCII的扩展表,表示的都是极特殊的字符,一般没什么用。所以中国人就直接拿来用了。
总结
python2的字符串其实更应该称为字节串。 通过存储方式就能看出来, 但python2里还有一个类型是bytes呀,难道又叫bytes又叫字符串? 嗯 ,是的,在python2里,bytes == str。python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode。
在我看来,每个电脑都有一张编码表 我们把编码解码就是去表里找对应的字符,然后打印出来。