我的字符串比较不起作用,
有什么想法吗?
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 )
返回:
test 'éclairage public' type: <class 'str'>
test 'éclairage public' type: <class 'str'>
False
False
False
True
所以"b"没有预期的组成,但我不知道为什么!
你的问题几乎可以肯定是a
和b
是两个不同的 Unicode 值,具有相同的规范化。作为一个简单的示例,请考虑以下两种显示é
的方式:
>>> b'exccx81'.decode()
'é'
>>> b'xc3xa9'.decode()
'é'
第一个是由e
(U+0065) 和组合变音标记´
(U+0301) 组成的双字符字符串。第二个是由é
(U+00E9) 组成的单个字符。
为了成功比较它们,您需要对它们进行规范化。有几种不同的规范化可用,但您使用哪一种对于比较目的并不重要,只要您对每种规范化使用相同的规范化即可。
>>> import unicodedata
>>> x = b'exccx81'.decode()
>>> y = b'xc3xa9'.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。您可能希望在存储任何用户输入之前对其进行规范化,并且需要确保对所有存储的数据使用相同的规范化。常见问题解答可以帮助您确定哪种规范化最适合您的使用。