python编码问题解决思路


相信很多人在接触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

Archives