美文网首页
python编码

python编码

作者: 咚咚董dyh | 来源:发表于2017-11-02 23:23 被阅读0次

    python编码

    python编码简介

    字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

    • decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
    • encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
    # -*- coding=gb2312 -*-
    
    a = u"中文"
    
    a_gb2312 = a.encode('gb2312')
    print a_gb2312
     
    a_unicode = a_gb2312.decode('gb2312')
    # 或者采用unicode(a_gb2312, 'gb2312')
    assert(a_unicode == a)
    
    a_utf_8 = a_unicode.encode('utf-8')
    print a_utf_8
    

    因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码.

    代码中字符串的默认编码与代码文件本身的编码一致。如:s='中文', 如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。

    提示: 编写python代码,需要在文件的头部加上coding=utf-8. python支持# -*- coding=utf-8 -*-coding=utf-8两种写法,效果相同,前者是多数语言的写法,后者是python支持的的简洁写法。

    如果字符串是这样定义:s=u'中文', 则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。

    如果一个字符串已经是unicode了,再进行解码则将出错。用非unicode编码形式的str来encode也会报错。因此通常要对其编码方式是否为unicode进行判断:

    isinstance(s, str) # 用来判断是否为一般字符串 
    isinstance(s, unicode)  #用来判断是否为unicode
    

    编码间的区别

    主要介绍python的编码机制,unicode, utf-8, utf-16, GBK, GB2312, ISO-8859-1等编码之间的区别。

    GBK与GB2312的区别

    GB码,全称是GB2312-80《信息交换用汉字编码字符集基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。Windows3.2和苹果OS就是以GB2312为基本汉字编码,Windows95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。

    GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。

    GBK包括GB2312的所有编码,有些字GB2312没有,需要用GBK来编码。

    其它编码(utf-8,GBK)转换为unicode

    unicode与其它编码之间的区别

    为什么不所有的文件都使用unicode,还要用GBK,utf-8等编码呢?
    unicode可以称为抽象编码,也就是它只是一种内部表示,一般不能直接保存。
    保存到磁盘上时,需要把它转换为对应的编码,如utf-8和utf-16。

    除上以上的编码方法,在读写文件时还可以使用codecs的open方法在读写时进行转换。

    系统编码的获取和设置

    获取系统编码,该段程序在英文WindowsXP上输出为:ascii

    # coding=utf-8
    
    import sys
    print(sys.getdefaultencoding())
    

    也可以用python自带的模块locale来检测命令行默认编码和设置命令行编码:

    import locale
     
    #get 
    locale.getdefaultlocale()
    #('zh_CN', 'cp936')
     
    #set
    locale.setlocale(...)
    

    编码错误

    IDE中编码错误

    在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。 如在UliPad中运行如下代码:

    s=u"中文"
    print s
    # 显示如下
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    

    这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。

    将最后一句改为:print s.encode('gb2312'), 则能正确输出“中文”两个字。

    若最后一句改为:print s.encode('utf8'), 则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。

    unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码. 使用str.class可以查看str的编码形式.

    python中sys模块原本有setdefaultencoding函数,但在启动脚本setting.py中被删除了,可以通过reload(sys)启用,这样可以解决编码问题:

    import sys
    if sys.getdefaultencoding() != 'utf-8':
        reload(sys)
        sys.setdefaultencoding('utf-8')
    

    常见的错误有setuptools, pip, install, UnicodeDecodeError: 'ascii' codec can't decode byte.

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not in range(128)  
    Something went wrong during the installation.  
    See the error message above.  
    

    原因与注册表有关,可能与某些国产软件对注册表的改写的gbk格式导致python无法进行第三方库的安装操作。

    解决方法:打开C:\Python27\Lib下的mimetypes.py文件,找到大概256行(你可以用Notepad++的搜索功能):default_encoding = sys.getdefaultencoding()
    在这行前面添加三行:

    if sys.getdefaultencoding() != 'gbk':  
        reload(sys)  
        sys.setdefaultencoding('gbk')  
    default_encoding = sys.getdefaultencoding()  
    

    保存,就解决问题了。

    相关文章

      网友评论

          本文标题:python编码

          本文链接:https://www.haomeiwen.com/subject/cfhzpxtx.html