Python 中的字符串比较 3

String comparison in Python 3

我的字符串比较不起作用,

有什么想法吗?

a = person.category[0].lower()
b = to_delete[5].lower()

print("test ", repr(a), "type: ", type(a))
print("test ", repr(b), "type: ", type(b))
print(a == b)
print(a is b)
print("éclairage public" == b)
print("éclairage public" == a )

returns:

test  'éclairage public' type:  <class 'str'>
test  'éclairage public' type:  <class 'str'>
False
False
False
True

所以 "b" 没有预期的组成,但我不知道为什么!

你的问题几乎可以肯定 ab 是两个不同的 Unicode 值,具有相同的 规范化 。作为一个简单的例子,考虑这两种显示方式 é:

>>> b'e\xcc\x81'.decode()
'é'
>>> b'\xc3\xa9'.decode()
'é'

第一个是由e(U+0065)和组合变音符号´(U+0301)组成的双字符字符串。第二个是由é(U+00E9).

组成的单个字符

为了成功比较它们,您需要对它们进行归一化。有几种不同的归一化可用,但您使用哪一种对于比较目的并不重要,只要您对每种归一化使用 相同 即可。

>>> import unicodedata
>>> x = b'e\xcc\x81'.decode()
>>> y = b'\xc3\xa9'.decode()
>>> x == y
False
>>> unicodedata.normalize("NFC", x) == unicodedata.normalize("NFC", y)
True

标准化 NFC,例如,通过将 U+0065/U+0301 替换为 U+00E9 来进行标准化。有关详细信息,请参阅 https://www.unicode.org/faq/normalization.html。您可能希望在存储之前对任何用户输入进行规范化,并且您需要确保对所有存储的数据使用相同的规范化。常见问题解答可以帮助您确定最适合您使用的规范化。