0

我有一个非常特殊的编码问题。我看过很多关于这个错误的问题,但没有实际答案。我知道 Python 中的 Unicode 问题,所以我开始每个文件:

#  -*- coding: utf-8 -*-

但是,UnicodeDecodeError当我运行我的软件时,我仍然会得到。此外,以下代码有效:

#  -*- coding: utf-8 -*-
g = " "
s = "2 000€"
if g in s:
    print s

错误发生在:

if gap not in tokenString:

tokenString字符串包含 Unicode。有趣的是,如果我尝试在该行之前打印它,它会毫无错误地打印。

这可能是什么原因?我觉得我错过了一些东西,我不明白是什么。

EDITED gap是 typeunicodetokenStringtype str

4

1 回答 1

3

您没有向我们提供足够的信息来确定解决您的问题,但我可以猜测:

如果gap是 a str,并且tokenString是 a unicode,这一行:

if gap not in tokenString:

... 将尝试转换gapunicode进行搜索。但是如果gap有任何非 ASCII 字符——例如,因为它是一个编码为 UTF-8 的 Unicode 字符串——这个转换就会失败。

例如:

>>> if 'é' in u'a':
...    print 'Yes'
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

如果gap是 aunicode并且tokenStringstr持有非 ASCII 码,您将遇到同样的问题:

>>> if u'a' in 'é':
...     print 'Yes'
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

您还会遇到相同或类似的问题,使用各种其他混合类型的运算符和方法调用(例如,u'a'.find('é'))。


解决的办法是在两边使用相同的类型in。例如:

>>> if 'é'.decode('utf-8') in u'a':
...     print 'Yes'

没有错误。


更大的解决方案是在我们的代码中始终使用一种或另一种类型当然,在边界处,你不能这样做(例如,如果你在unicode任何地方都使用,但你想写入一个 8 位文件),所以你需要在这些边界处显式调用decode和。encode但即便如此,您通常也可以将其包装起来(例如,使用codecs.open,或使用自定义文件写入功能,或其他任何东西,因此您所有的可见代码都是 Unicode,填充停止。


或者,当然,您可以使用 Python 3,它会立即捕获您尝试比较字节字符串和 Unicode 字符串并引发 a TypeError,而不是尝试从 ASCII 解码字节并且误导工作或给您一个更令人困惑的错误...< /p>

于 2013-06-08T00:35:44.420 回答