您没有向我们提供足够的信息来确定解决您的问题,但我可以猜测:
如果gap
是 a str
,并且tokenString
是 a unicode
,这一行:
if gap not in tokenString:
... 将尝试转换gap
为unicode
进行搜索。但是如果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
并且tokenString
是str
持有非 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>