Ваша проблема почти наверняка состоит в том, что a
и b
- это два разных значения 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. Возможно, вы захотите нормализовать любой пользовательский ввод перед его сохранением, и вам нужно убедиться, что для всех сохраненных данных используется одна и та же нормализация. FAQ может помочь вам решить, какая нормализация наиболее подходит для вашего использования.