比较Python 2.7.5中的字符串和unicode

时间:2013-11-14 00:42:49

标签: python python-2.7 python-unicode

我想知道为什么我这样做:

a = [u'k',u'ę',u'ą']

然后输入:

'k' in a

我得到True,而:

'ę' in a

会给我False吗?

这真让我感到头疼,而且似乎有人故意让这个让人发疯...

4 个答案:

答案 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