• python字符decode与encode的问题


    同事在工作中遇到一个字符编码的问题;问题是:从mysql数据库中读出来的varchar类型数据在python是unicode类型的。

    但他却对这个unicode字符进行了decode,因为他以为读出来的是utf-8(python中的str类型)。程序中报错了。

    但比较奇怪的是,另一个大神同事也做了同样的事情,却没有报错。细细比较代码起来,发现没出错的同事的代码中多了一行

    reload(sys)
    sys.setdefaultencoding('utf-8')

    个人猜测,当python在做decode操作的时候,比如a.decode('utf-8'),如果a不是utf-8类型的,python会自动的试着去将a先转化为utf-8,然后在进行decode;

    同样,当python在做encode操作的时候,比如a.encode('utf-8'),如果a不是unicode类型的,python会自动的试着去将a先转化为uncode类型的,然后再进行encode

    而python在自己自动转化的时候会用什么作为转码标准呢,就是用 defaultencoding里面的编码作为转码标准;

    下面的代码能说明一些这样的问题:

    #coding:utf-8
    import sys

    a = '中文'
    print type(a)

    b = u'中文'
    print type(b)

    reload(sys)
    sys.setdefaultencoding('ascii')

    #print a.encode('gb18030')
    #这个时候报错信息是
    #UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

    #print b.decode('utf-8')
    # 这个时候的报错信息是
    #UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

    reload(sys)
    sys.setdefaultencoding('utf-8')


    print a.encode('gb18030')

    #这个时候是没问题的。

    print b.decode('utf-8')

    #这个时候也是没问题的。

  • 相关阅读:
    2020-2021-1 20201314 《信息安全专业导论》第三周学习总结
    罗马数字转阿拉伯数字
    BASE64编码-20201314黄斯阳
    学期(2020-2021-1) 学号(20201314) 《信息安全专业导论》第2周学习总结
    师生关系
    快速浏览教材 。
    浏览教材的疑问
    2020-2021-1 20201314 《信息安全专业导论》第一周学习总结
    第四周作业补交
    第四周作业
  • 原文地址:https://www.cnblogs.com/yuhan-TB/p/3275332.html
Copyright © 2020-2023  润新知