我想编写一些简单的Python脚本,可以在不同的Python版本上不加修改地使用,但是我遇到字符串问题......
text = get_data()
phrases = [ "Soggarth Eogham O'Growney ,克尔・德怀尔", "capitis #3 病态上升涨大的繁殖性勃现", "IsoldeIsult、第一任威尔士亲王" ]
for item in phrases:
if item not in text: **# 3.3 ok. 2.7 UnicodeDecodeError**
print ("Expected phrase '" + item + "' not found")
上面的代码适用于3.3。当我尝试在2.7下运行时,我得到了
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 27: ordinal not in range(128)
通过将第一行更改为
可以轻松解决此问题text = get_data().encode('utf-8')
但是,这不适用于3.3。有没有办法使用一个版本的源代码? Python noob。
答案 0 :(得分:3)
似乎get_data()
将返回Unicode字符串。您收到错误是因为您将Unicode字符串与8位字符串连接起来,强制转换,默认情况下将使用ASCII编解码器完成,并且由于数据包含非ascii字符,因此失败。
让上述代码工作的最好方法是确保所有字符串都是Unicode,前缀为u“”:
phrases = [ u"Soggarth Eogham O'Growney ,克尔・德怀尔",
u"capitis #3 病态上升涨大的繁殖性勃现",
u"IsoldeIsult、第一任威尔士亲王" ]
但是,这只适用于Python 2.x和Python 3.3。如果你需要使用Python 3.2或3.1,你需要有一个方法,使它在Python 2下成为Unicode,但在Python 3下不会做任何事情(因为它已经是Unicode)。
这样的函数通常称为u()
,你可以像这样定义它:
import sys
if sys.version < '3':
import codecs
def u(x):
return codecs.unicode_escape_decode(x)[0]
else:
def u(x):
return x