• [python基础]关于中文编码和解码那点事儿


      我们在用python处理中文的时候,或多或少会遇到这样一些错误

      

    常见错误1:

    SyntaxError: Non-ASCII character 'xe4' in file C

    常见错误2:

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

    毫无疑问,我们在用python2.7.x的时候都会遇到这种问题,我们常规的解法又是怎么样的呢

    # coding:utf-8
    import requests
    
    
    def print_text():
        url = 'http://www.cnblogs.com/'
        print requests.get(url).text.encode('utf-8')
    
    
    print_text()

    首先在文件py文件的头部加上标识coding:utf-8 ,然后使用encode('utf-8'),一般这样处理,文字都可以正常显示到我们的控制台了。那有没有想过我们为什么要这样做?如果你不仅是对写code感兴趣,更想了解其中的原因的话,那我们接着往下看

    说起字符的编码与解码,那就不得不提字符集了

    如图所示,我们所知的英文编码都是采用ansi编码,随着中国的崛起,国家也开始信息化,但是计算机不认识中国汉字,怎么办呢,我们制定自己统一的字符集,这就是GB2312,

    后来更新的字符集,GBK,GB18030,BIG5 ,都是在原来的基础之上增加一些新的元素的识别,比如一些生僻字,繁体字认识。

    这样一来不是中文一套,英文一套,那后来的一些其它的国家文字不就都不能互相通用了,那干脆一锅端,将这些英文,中文,各国的语言文字大一统,Unicode就出现了,不仅兼容了这些文字,与方便了各国的信息交流.

     在Unicode编码方式下,又存在 utf-8,utf-16,utf-32的编码方式

     通过上面的一些例子,我们可以大致对于编码和解码有一个大概的印象,那接下来我们看看python2.7.x对于编码是怎么处理的,还是先上一个图

    basestring下面有两个对象,unicode,str 那这两者的关系是怎么样的?

      unicode   ==encode==>  str

          str         ==decode==>   unicode 

    我们先看python的输出

    # coding:utf-8
    s = '中文'
    print type(s)

    输出:

    <type 'str'>

    在看看decode之后的处理方式

    # coding:utf-8
    s = '中文'.decode('utf-8')
    print type(s)

    输出:

    <type 'unicode'>

    这样实验我们可以很直观的感受到,当我们要输出一个中文的时候:我们输出的是一个经过unicode原始对象encode后的str,那当我们拿到一个返回对象,最常见的在爬虫里面得到返回字符串的时候我们怎么处理呢?

    首先我们要在py文件头部声明处理编码,因为我们的py文件默认采用的是ascii编码,当返回的字符串写回到文档时就与文档编码相冲突,这里就会报销:

    #coding:utf-8 

    一般我们加上coding:utf-8就够了,或者coding:gbk也可以

    然后对于返回对象我们可以查看一下类型type(response.text)

    如果是unicode ,那这response.text.encode('utf-8')就可以得到我们要的str对象,如果是str,我们可以直接print出来,或者先解码,在按你需要的方式编码.

    参考文章:

    中文编码杂谈

    python进阶-编码处理小结

  • 相关阅读:
    web项目中加斜杠与不加斜杠
    事务是什么,以及事务四个特性
    Java中 a+=b和a=a+b有什么区别?
    JAVA基础15
    JAVA基础13
    JAVA基础12
    JAVA基础11
    JAVA基础10
    DELPHI下的SOCK编程
    设置VSS2005使支持通过Internet访问(转)
  • 原文地址:https://www.cnblogs.com/codefish/p/5016312.html
Copyright © 2020-2023  润新知