3

我想编写一些简单的 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。有什么方法可以使这个工作与一个版本的源代码一起工作?蟒蛇菜鸟。

4

1 回答 1

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
于 2013-07-30T14:02:43.090 回答