zoukankan      html  css  js  c++  java
  • 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')

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

  • 相关阅读:
    html设置360兼容/极速模式
    es查询备忘录
    TypeError: __init__() got an unexpected keyword argument 'strict'
    pandas处理csv
    scrapy中cookie处理
    滑动验证码破解(一)
    python 自定义属性访问 __setattr__, __getattr__,__getattribute__, __call__
    数据库的增删改、单表查询
    库的操作,表的操作,数据类型,完整性约束
    Mysql常用命令(二)
  • 原文地址:https://www.cnblogs.com/yuhan-TB/p/3275332.html
Copyright © 2011-2022 走看看