TGViewer
Python Portal Python Portal @pythonportal · 50.3K subscribers
Post #5817 5.77K
Почему "é" == "é" может возвращать False в Python

Вот один из типичных Unicode-подводных камней, который часто приводит к очень запутанным багам в Python:

Две строки могут выглядеть одинаково на экране, но при этом отличаться внутри:
import unicodedata

a = "é" # один кодпоинт: U+00E9
b = "e\u0301" # "e" + комбинирующий акцент (acute accent)

print(a)
print(b)

print(a == b)
# False

print(len(a))
# 1

print(len(b))
# 2


Внешне они одинаковые, но Python хранит их как разные последовательности Unicode-кодпоинтов.
Посмотреть, что реально внутри строки, можно через repr() и unicodedata.name():

import unicodedata

for char in "e\u0301":
print(repr(char), unicodedata.name(char))


Вывод:
'e' LATIN SMALL LETTER E
'́' COMBINING ACUTE ACCENT


Как правильно сравнивать такие строки?
Нужно нормализовать Unicode перед сравнением:
import unicodedata

a = "é"
b = "e\u0301"

a_normalized = unicodedata.normalize("NFC", a)
b_normalized = unicodedata.normalize("NFC", b)

print(a_normalized == b_normalized)
# True


NFC
приводит текст к “составной” форме, где комбинация "e" + accent превращается в один символ "é".

Такие различия часто появляются в:
- пользовательском вводе
- копипасте из разных источников
- именах файлов
- поиске и фильтрации текста
- данных из разных языков и систем

Ещё один похожий кейс — невидимые символы
Например, zero-width space может ломать сравнение вообще без визуальных признаков:
text = "hello\u200b"

print(text == "hello")
# False

print(text)
# hello

print(repr(text))
# 'hello\u200b'


print()
скрывает проблему, но repr() показывает реальное содержимое строки.

Подробнее можно почитать здесь:
https://pythonkoans.substack.com/p/koan-15-the-invisible-ink

👉 @PythonPortal
  • 👍 13
  • ❤ 6
  • 🔥 2
  • 🤣 1
More from @pythonportal
  1. Oct 5, 2026DeepSeek выложила в открытый доступ библиотеку, которая ускоряет вычисления на GPU, лежащи…
  2. Oct 4, 2026Modern Robotics: Mechanics, Planning, and Control. Сохраните на потом. Это полноценный уче…
  3. Oct 4, 2026«Изучение математики. Почему память, практика и техника важнее таланта» Чтобы освоить мате…
  4. Oct 3, 2026«Как обучить нейросеть» — краткий конспект лекций курса MIT по глубокому обучению за 2024…
  5. Oct 3, 2026Tencent выпустила новую модель для перевода, которая, по их словам, обходит Google Transla…
  6. Oct 2, 2026Один из лучших ресурсов по производительности SQL: use-the-index-luke.com 👉 @PythonPortal
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →