我想编写一些简单的 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 菜鸟。

最佳答案

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

关于python - 如何使用 Python 字符串使相同的代码在 2.6、2.7、3.x 中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17936029/

10-14 17:42
查看更多