2010-12-23 136 views
4

我发现Python中的unicode真的很麻烦,为什么Python没有为所有的字符串使用utf-8?我在中国,所以我必须使用一些不能用ascii表示的中文字符串,我用u''来表示一个字符串,它在我的ubuntu机器中运行良好,但在另一个ubuntu机器(由linode.com提供的VPS)中运行,它有时会失败。错误是:Python unicode:为什么在一台机器上工作,但在另一台机器上却失败了?

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)

我使用的代码是:

self.talk(user.record["fullname"] + u"准备好了") 
+0

我不知道它会帮助,但你可以尝试添加`sitecustomize.py`文件到PYTHONPATH并把`import sys; sys.setdefaultencoding('utf-8')`在该文件中。 – khachik 2010-12-23 12:39:05

+0

Python 3拥有unicode中的所有字符串。 – gruszczy 2010-12-23 12:44:43

+0

你是什么意思“它有时会失败”,你的意思是相同的数据? – guival 2017-09-19 07:44:04

回答

12

与著名UnicodeDecodeError的事情是,当你做一些字符串操作一样,你做了刚才:

user.record["fullname"] + u" 准备好了" 

因为你正在做的是串联使用Unicode的海峡,所以Python会做的隐性强制的海峡到的Unicode这样强迫像这样做的连接前:

unicode(user.record["fullname"]) + u" 准备好了" 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
     Problem 

而且还有因为这样做问题时3210 python将使用Python 2中的默认编码ASCII来解码字符串。*如果它发生字符串user.record["fullname"]有一些无ASCII字符,它将引发着名的UnicodeDecodeError错误。

所以你怎么能解决这个问题:

# Decode the str to unicode using the right encoding 
# here i used utf-8 because mostly is the right one but maybe it not (another problem!!!) 
a = user.record["fullname"].decode('utf-8') 

self.talk(a + u" 准备好了") 

PS:现在在Python 3的默认编码为UTF-8,你不能做一个Unicode的串联与串一件事(字节在Python 3)所以没有更多隐式强制

0

因为Python的2.X的默认编码是ASCII,除非它的手动更改。这里是粗黑客在脚本中包括任何其他代码之前

import sys 
reload(sys) 
sys.setdefaultencoding("utf-8") 

这将改变默认的Python编码设置为UTF-8。

1

您需要尽早解码所有非Unicode字符串。尽量确保没有UTF-8字节存储在内存中的任何位置,并且只有unicode对象。例如,确保user.record的元素在创建时都转换为unicode,这样就不会出现像这样的错误。或者只是使用Python 3,很难混合它们。

相关问题