zoukankan      html  css  js  c++  java
  • Python_关于python2的encode(编码)和decode(解码)的使用

    在使用Python2时,我们习惯于在文件开头声明编码

    # coding: utf-8

    不然在文件中出现中文,运行时就会报错 SyntaxError: Non-ASCII character... 之类,这是因为python2的文件编码默认使用的ascii,ascii码是不支持中文的。

    如果在开头声明了编码,文件编码就会变为utf-8。

    python执行过程的编解码

    python使用的unicode类型作为编码的基础类型,默认情况下,python在执行文件过程中的编解码为 str-->unicode-->str,当我们在python开头声明utf-8编码后,编解码就变为了  str-->ascii-->str

    举个简单例子,就可以验证这个现象。

    # coding:utf-8
    s = "我要学Python"
    print(1, s)

     从打印结果可以看出,我们没有做任何处理,中文在执行过程就被处理成了ascii码

    encode&decode

    在了解了Python执行过程的编码转换后,那我们自己如果转换编码该如何实现呢?这里就得使用两个内置方法 encode编码和decode解码。

    例如:

    # coding:utf-8
    s = "我要学Python"
    s.encode("utf-8")   # 编码
    s.decode("utf-8")   # 解码

    上面是方法的简单运用,但是执行上面代码,第3行就会出现编解码过程中常见的一个报错

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

    简单分析下,明明执行的encode方法,为什么会抛decode错误呢?这就要从上面介绍的python执行过程来分析了。

    在执行encode方法编码时,python先要解码,而Python解码默认用unicode格式,而文件开头指定的编码格式为ascii,这就导致编码格式与解码格式不一致,从而产生了报错 ascii 不能解码成 unicode。

    要解决这个问题,只需要在编码前,用utf-8格式解码就可以了

    s = "我要学Python"
    s.decode("utf-8").encode("utf-8")   # 编码
    s.decode("utf-8")   # 解码

    中文乱码解决方法

    在了解编解码过程后,我们来解决实际遇到的问题:接口响应中文乱码!

    比如:在接口测试中,有些响应类似 "u9875u9762u4e0du5b58u5728" 的响应内容,看起来就像乱码

    注意看乱码前面有个u ,这表示使用的unicode编码字符。可用以下方法进行解码:

    # 直接在 unicode 字符串前加u  ===> 使用Python机制自动解码
    s = u"u9875u9762u4e0du5b58u5728"
    print(s)   # 打印:页面不存在。因为字符串为unicode编码格式,python在执行过程中,默认就是使用的unicode解码,编解码类型一致,就看到了中文打印内容
    
    # 使用 decode 方法解码成中文 ===> 主动解码
    s = "u9875u9762u4e0du5b58u5728"
    print(s.decode("unicode_escape"))

    常见问题

    格式化带有中文的字符串报错

    格式拼接的字符串包含中文,会抛错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

    # coding:utf-8
    
    s = "u9875u9762u4e0du5b58u5728"
    
    # 拼接的字符串 不包含 中文字符===>正常
    print("result: %s" % s.decode("unicode_escape"))
    
    # 拼接的字符串 包含 中文字符串===>异常
    print("结果: %s" % s.decode("unicode_escape"))

     

    问题分析:

     解决方法:

    统一编码格式

    # coding:utf-8
    
    s = "u9875u9762u4e0du5b58u5728"
    
    # 方法1:将右边变为 ascii 编码
    print("结果:%s" % s.decode("unicode_escape").encode("utf-8"))
    
    # 方法2:将左边变为 unicode 编码
    print(u"结果:%s" % s.decode("unicode_escape"))

    带有中文的字符串反转后乱码

    带有中文的字符串使用列表反转方式后乱码,使用decode("utf-8") 解码,报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 0: invalid start byte

    # coding:utf-8
    
    s = "qta_baseline_test_勿删"[::-1]
    print(s)
    print(s.decode("utf-8"))

     问题分析:

    中文被Python解析后,先转换成ascii码

     当使用列表反转方式后,实际把ascii反转

     这就导致了反转后的乱码无法被decode("utf-8")正常解码

    解决方法:

    因为采用的utf-8编码,所以先使用utf-8解码,解码后再反转

    # coding:utf-8
    
    s = "qta_baseline_test_勿删"[::-1]
    print(s)
    
    s = "qta_baseline_test_勿删".decode("utf-8")[::-1]
    print(s)
    s = s.encode("utf-8")       # 为了后续字符串能正常使用,建议在按原编码方式编码
    print(s)

  • 相关阅读:
    jQ的工具类方法
    jq-ajax
    jq-ajax-get
    LOAD
    JQ的尺寸类
    JQ-DOM与元素的操作
    jQ-DOM属性的操作
    jQ的事件
    3位创业公司CEO亲述:200人的小公司,这么做数据管理就对了
    十二潜意识的智商
  • 原文地址:https://www.cnblogs.com/testlearn/p/15458893.html
Copyright © 2011-2022 走看看