相信很多人在接触python的时候都会遇到奇怪的编码问题,我也不例外,一开始的时候,只要一遇到中文就要头痛一阵。后来开始熟练使用decode和encode之后基本就不怕这种问题了,但是对python转换编码的机制仍然没有深入研究,这也许就是这次遇见编码问题的原因吧。
一直以来,我总是一厢情愿的认为用decode和encode足够了,而且大多数情况下都能够完美工作。
最近我遇到的一个问题困扰我5个小时,我在一个文件里写了一组辅助函数,并且在当前文件写了一些简单的测试都是可以通过的,我再另一个文件调用这个函数的时候,一模一样的参数和参数值,就得到下面的错误:
'ascii' codec can't decode byte 0xe5 in position 18: ordinal not in range(128)
我这个问题很奇怪,我的程序编码是utf-8,而且已经在文件开始声明了。
# -*- coding:utf-8 -*-
为什么提示'ascii'转换错误?
在一篇文章里看到说python编码转换的机制,在遇到str和unicode的时候会自动进行编码转换,但是python事先不知道str的编码,它会通过sys.getdefaultencoding()获取编码然后decode。下面的程序运行结果是:ascii。这就说明python根本不鸟我们声明的编码。
# -*- coding:utf-8 -*- import sys print sys.getdefaultencoding()
基于这个问题的解决办法是直接设置sys的默认编码就好了,下面是测试代码
# -*- coding:utf-8 -*- import sys print sys.getdefaultencoding() reload(sys) sys.setdefaultencoding('utf-8') print sys.getdefaultencoding()
通过这种方式完美的解决了我现在遇到的问题
参考:http://in355hz.iteye.com/blog/1860787