python2中常见的几个编码现象

接触python这门语言,到现在,已经有很长的时间了。从最初的python2入手,到python3,再到现在,离python2放弃支持只有约两年的时间。

作为一个非科班出生的IT从业人员,这一路上,磕磕绊绊很多,很多概念,用法,需要很长的使用才能理解,例如,python2中一直头疼的编码问题。

python2的开发过程中,会遇到的编码设置,主要在这几个地方:

1,文件保存时,采用utf-8编码;

2,开发项目时,文件顶部使用coding:utf-8标明编码;

3,reload(sys),sys.setdefaultencoding('utf-8'),此种修改编码;

4,在输出时,特别是windows下的cmd中输出时,额外encode('gbk');

接下来,将一步一步来理解他们。

我们知道,计算机中所有的内容,无论是存在磁盘上的文件,还是内存中的指令,都不是我们看到的,英文或者中文。他们都是以01形式存在的二进制码。而我们的所看到的中文,英文,都是相关软件在打开后,根据某种规则,让特定的二进制码映射到字符,并且显示出来。

这里就是 1 中涉及到的编码。我们通过敲击键盘,输入的文字,将依据某种规则,变成二进制码,进行存储,例如utf-8,gbk。同样的,当我们再次打开文件时,将根据这种编码规则,将显示成字符。

比如,我们看到的‘中文’,转成的字符时并不是‘中文’,而是其他。那么我们是怎么看到显示屏上的'中文'的呢?这里就出现了与编码对应的东西,字符集,例如,utf-8字符集,gbk字符集。字符集将那些根据二进制码,转成的字符,映射成显示屏上看到的文字。

这也就能解释,如果本地用非utf-8编码保存的项目文件,如果有中文,在别的开发人员的电脑上,打开可能乱码:因为一个有一定开发经验的开发人员,会使用大众推荐的utf-8来保存文件,而不是少众的gbk,或者其他。

这里提到了utf-8,这是一种近乎囊括其它所有编码规则的编码,这也是他被推崇的原因之一。

接下来,是文件顶部的coding:utf-8。

在讲这个之前,就要提到运行python程序。我们通常使用python test.py 的方式运行一个python程序,虽然,python是一门解释型语言,我们能够在交互界面逐条的运行。但是,在此种情况下,即python test.py方式,python会先进行编译,当然,只是编译到内存中。

python在编译前,先,使用文件存放时指定的编码,将二进制数据转成字符,然后进行编译,尝试使用ascii编码将读取到的内容,代码和中文,编码成为二进制数据写进内存,也就是指令。

而编译时使用的ascii,是默认的,而ascii,并不支持中文,所以,当未指定coding:utf-8时,将提示ascii并不能对某个字符编码。

当然,指定utf-8并不是一成不变的。python只是需要一个支持中文的编码,而非utf-8,但utf-8有他的优势,并且也是大多数开发人员接受的,所以,也就约定俗称了。在windows平台下,coding:gbk也是可行的。

到此,就讲述了 2 中提到的编码,文件顶部的 coding:utf-8。

紧接着,是sys.setdefaultencoding(‘utf-8’)用法中的编码。

从函数的名字可以看出,这是一个关于默认编码的设置,那么要从两个方面思考。第一,哪些地方的默认?第二,他有什么用?

第一个问题,哪些地方的默认?

此处我能举出的例子有限。讲第一个例子时,需要提前知道,python中的字符串有两种存在,一种是str形式存在,一种是以unicode形式存在。str形式,可以看作是,二进制码,他和编码后的格式相同。另一种是unicode,他可以看作是字符,和解码后的格式相同。

当我们使用 a = u'中文'时,和a = unicode('中文'),能起到类似格式的结果。当使用unicode函数是,可以使用unicode('中文','utf-8')或者其他编码,来解码变成unicode码,而未指定时,将使用python的默认编码,也就是原本的sys.defaultencoding(),通常也就是,ascii编码。当通过setdefaultencoding()重新指定编码,能够解决很多编码带来的异常。当然,有没有可能引发其他异常?暂时没有发现。

第二个例子,当我们定义一个str格式的变量a时,可以通过decode().encode()来转编码,但是,也可以直接通过encode()来转,此时就将使用默认的编码,及defaultencoding()函数显示的编码,也是ascii编码。

第二个问题,有什么作用?

这个用法,是在搜寻ascii编码带来的error时找到的,并且行之有效——他能直接避免你可能遇到的编码问题,并没有具体的例子。有点类似于,万能药,但,肯定会引发不容易遇到的其他错误,我想如果你能遇到这种错误的时候,也一定对编码有了很深的理解,能够尝试自己解决问题了。

到此,关于setdefaultencoding()就讲述完毕。

接下来,是windows的cmd输出时的编码。

不难找到很多介绍,说windows使用的是gbk编码,所以会乱码,但是,怎么个过程呢?

在输出时,如果是str格式,相当于编码后的数据,也相当于二进制码,其实当作是一段密文。而输出窗体,只是对字符给予特定的显示,这里的字符,需要的是unicode类型。所以,str将先进行解码。而解码,是cmd窗口来做,更好的理解可能是,windows来做。而windows使用的是gbk编码。你可以想象,两套不同的编码,即加密和解密的规则不同,将导致最后得到的字符不同,而映射显示出来的内容,自然也就和最初的设定大不一样。

那如果是unicode码呢?抱歉,很多文章讲到,python的unicode格式,可以转成其他编码内容,是一种类似于中间态的数据。然而,我对此的理解却是,需要是utf-8编码转成的unicode码,才具有这种特性。因为utf-8包含了其他所有的编码规则,他是兼容其它编码的,所以,当以他作为编码,解码转成unicode时,他能直接输出,也能再次使用encode编码,再次输出。这也是顶部coding:utf-8所带来的一个便捷之处。

比如,如果我想在windows下的输出不乱码,该怎么做?

1,指定gbk。

在顶部,指定,coding:gbk。这样带来的效果是,str是按照gbk编码的,对应cmd窗口输出时的编码gbk。

2,转成gbk。

当顶部使用的是utf-8,那么可以通过decode('utf-8'),转成具有包容性的unicode,那么输出就没有问题了。

到此,关于python在项目开发中,关于编码的问题,也算是大致都阐述明白了。这些概念,只是个人查阅相关资料,以及实际操作过程后的总结,如果有错误之处,及时联系,并将及时修改。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171218G0X9H000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券