同事在工作中遇到一个字符编码的问题;问题是:从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')
#这个时候也是没问题的。