все Python 3unicodedataфункция
unicodedata.normalize()
нормализация
Приводит строку к одной из нормальных форм Unicode — NFC, NFD, NFKC, NFKD, — чтобы одинаково выглядящие строки стали равны.
Синтаксис
unicodedata.normalize(form, unistr, /)
'й' бывает одной кодовой точкой (U+0439, форма NFC) или двумя — 'и' плюс комбинируемое бреве (форма NFD): так приходит текст из macOS, из имён файлов и копирования из PDF. Выглядят строки одинаково, но == даёт False, а len() — 1 и 2. Перед сравнением, поиском и записью в базу приводите к NFC; формы NFKC/NFKD ещё и меняют смысл ('fi²' → 'fi2'), их берут для поиска, а не для хранения.
Примеры
import unicodedata
a = 'й' # одна кодовая точка U+0439
b = 'и\u0306' # и + комбинируемое бреве
print(a == b, len(a), len(b)) # → False 1 2
print(unicodedata.normalize('NFC', b) == a) # → True
print(len(unicodedata.normalize('NFD', a))) # → 2
import unicodedata
print(unicodedata.normalize('NFKC', 'fi²')) # → fi2 — совместимая форма меняет смысл
print(unicodedata.normalize('NFC', 'fi²')) # → fi²
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности