我想知道为什么我这样做:
a = [u'k',u'ę',u'ą']
然后输入:
'k' in a
我得到True
,而:
'ę' in a
会给我False
吗?
这真让我感到头疼,而且似乎有人故意让这个让人发疯...
答案 0 :(得分:12)
这是为什么?
在Python 2.x中,您无法将unicode直接与非ascii字符进行比较。这会引发警告:
Warning (from warnings module):
File "__main__", line 1
UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
然而,在Python 3.x中没有出现,因为所有字符串都是unicode对象。
<强>解决方案吗
您可以将字符串设为unicode:
>>> u'ç' in a
True
现在,您要比较两个unicode对象,而不是unicode和string。
或者在比较之前将两者转换为编码,例如utf-8:
>>> c = u"ç"
>>> u'ç'.encode('utf-8') == c.encode('utf-8')
True
此外,要在程序中使用非ascii字符,您必须在文件顶部指定编码:
# -*- coding: utf-8 -*-
#the whole program
希望这有帮助!
答案 1 :(得分:3)
您需要显式地创建字符串unicode。下面显示了一个示例,以及未将其指定为unicode时给出的警告:
>>> a = [u'k',u'ę',u'ą']
>>> 'k' in a
True
>>> 'ę' in a
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False
>>> u'ę' in a
True
答案 2 :(得分:1)
u'ę'
是unicode
对象,而'ę'
是当前区域设置中的str
对象。有时,根据区域设置,它们将是相同的,有时它们不会。
Python 3的一个好处是所有文本都是unicode,因此这个特殊问题就消失了。
答案 3 :(得分:0)
确保specify the source code encoding并在unicode文字前面使用u
。
这适用于Python 3和Python 2:
#!/usr/bin/python
# -*- coding: utf-8 -*-
a = [u'k',u'ę',u'ą']
print(u'ę' in a)
# True