различное поведение метода unicodedata.normalize - PullRequest
0 голосов
/ 04 ноября 2018

Следующий код взят из This SO Post.

def unicodeToAscii(s):
    return ''.join(
        c for c in unicodedata.normalize('NFD', s)
        if unicodedata.category(c) != 'Mn'
        and c in all_letters
    )

Когда я запускаю это

print(unicodeToAscii('Ślusàrski'))

я получаю следующий вывод

Slusarski

Но когда я просто запускаю unicodedata.normalize('NFD','Ślusàrski'), я получаю ту же старую строку Ślusàrski, что и вывод.

Код в функции просто делает то же самое и игнорирует все символы, которые не относятся к категории Mn и если она входит в all_letters. почему я не получаю то же самое с вызовом метода normalize?

1 Ответ

0 голосов
/ 04 ноября 2018

Вывод unicodedata.normalize('NFD','Ślusàrski') может выглядеть так же, как входная строка, но это не так. Если мы используем ascii(), чтобы все символы, не входящие в ASCII, отображались с экранированием \uXXXX, мы получаем:

>>> print(ascii(unicodedata.normalize('NFD','Ślusàrski')))
'S\u0301lusa\u0300rski'

Здесь мы видим эффекты NFD: каждый акцентированный символ раскладывается в неакцентированный символ плюс символ акцента (с категорией Mn). Вот почему остальная часть вашего первого фрагмента кода выдает Slusarski: он не работает на Ś, он работает на S + ´.

...