Python2与Python3的编码问题

来源:互联网 发布:CCD软件接口GiGe 编辑:程序博客网 时间:2024/05/21 17:50

什么是编码

将明文转换为计算机可以识别的的编码文本称为“编码”, 反之从计算机可识别的编码文本转回明文为“解码

ASCII

计算机上的数据都是以二进制的形式存储的,1个字节(8比特)可以表示256种状态,英文只有26个字符,再加上一些特殊字符,使用128个就够了,计算机就可以使用127个不同字节来存储英语文字,这就是ASCII编码

最开始的时候8位中的最高位是没有用到的,后来为了表示拉丁文,将最高位用上形成扩展ASCII编码,一个字节就用满了。

GB2312

计算机进入中国后,无法显示中文,一个自己已经被占满了,我国重新制定了一个编码表,将扩展的第八位对应的拉丁文全部删掉,规定一个小于127的字符与原来的意义相同,当两个大于127的字符链接在一起的时候,就表示一个汉字,前面一个字节为高字节(0xA1-0xF7),后面一个字节为低字节(0xA1-0xFE),这样可以表示7000多个汉字,这种编码叫做GB2312。GB2312是对ASCII的中文扩展

GBK和GB18030

由于汉字的数量太大,GB2312不能满足需求,后来规定只要第一个字节大于127就固定表示一个汉字,不管后面的是不是扩展字符集里面的内容,扩展后的编码成为GBK, GBK包括了GB2312的所有内容,同时增加了近20000个新的汉字(包括繁体)和符号

Unicode

在Unicode出现之前,每个国家都搞自己的编码,彼此之间互不支持,带来很多麻烦,国际标标准组织提出来一个统一的编码标准:Unicode

Unicode用两个字符来表示一个字符,可以提供65535种字符,足够覆盖世界上的所有符号

utf-8

Unicode的出现,提供了统一的标准,但对于英文世界的国家来说,一个字节完全够用,如果使用Unicode会浪费大量空间,为了解决这个问题提出了utf-8,一种针对Unicode的可变长度字符编码,可以使用1-4个字节表示一个符号,根据不同的符号变化字节长度,当字符在ASCII编码范围时,用一个字节表示,兼用ASCII。

使用这样的编码的好处是,虽然内存汇总的数据都是Unicode,但当数据保存到磁盘或者用于网络传输时,使用utf-8会节省更多的流量和硬盘空间。

Unicode和utf-8的关系: Unicode是内存编码表示方案(规范),而utf-8是如何保存和传输Unicode的方案(实现)


Python2 中的sting编码

在python中的编码解码是这样的:
这里写图片描述

在Python2中,有两种字符串类型:str类型和Unicode类型,分别存储的是字节数据和Unicode数据。

>>> s1 = "中国">>> type(s1)<type 'str'>>>> >>> s2 = s1.decode("utf-8")>>> type(s2)<type 'unicode'>>>> 

Python3中的string编码

在python3中,也有两种数据类型:str和bytes; str类型存unicode数据,bytse类型存bytes数据,与python2比只是换了一下名字而已。

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。

Python3中的编码思想:

Python 3清晰地将文本和二进制数据区分开了,不会对bytes字节串进行自动解码。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。


python2与python3编码的异同点

共同点:

在Windows系统中需要使用gbk来解码, 无论utf-8还是gbk都只是一种编码编码规则,一种把Unicode数据编码成字节数据的规则。

不同点:

  • python3中将utf-8或者gbk等编码的字节数据转为Python3中的str类型, utf-8编码的bytes <—> str

  • python2中将 utf-8或者gbk等编码的str编解码为Python2中的Unicode, utf-8编码的str <—> unicode