Понимание использования кодирования / декодирования для удаления диакритических знаков - PullRequest
0 голосов
/ 02 октября 2019

Мне интересно узнать, как убрать диакритические знаки из текста. Тем не менее, я пытаюсь лучше понять, что происходит в следующих строках кода, которые я нашел в сообщении от 2017 года ( Как заменить акцентированные символы в python? ):

import unicodedata

text = unicodedata.normalize('NFD', text).encode('ascii','ignore').decode('utf-8')

Вот мое грубое понимание:

unicodedata.normalize('NFD',text) переводит каждый символ в его разложенную форму (например, à становится a),.

.encode('ascii','ignore') преобразует нормализованный текст в байтовую строку ascii (b'string') и игнорирует все ошибки.

.decode('utf-8') возвращает строку, декодированную из заданных байтов, но здесь я застрял,Почему бы не использовать .decode('ascii') вместо этого? Пересекаются ли две кодировки?

1 Ответ

2 голосов
/ 02 октября 2019

Ваше понимание в основном верно. Хитрость .encode('ascii', 'ignore'). ASCII может выражать только 128 символов, и многие из них даже не печатаются. Набор символов ASCII определенно не содержит символов с диакритическими знаками. Поэтому он пытается принудительно ввести текст в набор символов ASCII, и ignore заставляет все символы, которые он не может выразить, отбрасываться без уведомления;который избавляет от всех этих разложенных диакритических знаков.

Вы правы, что расшифровка его как UTF-8 по своей сути не имеет большого смысла;расшифровка его как ASCII будет иметь больше смысла. Но, как и многие другие кодировки, UTF-8 - это суперсет ASCII. Любая допустимая строка ASCII также является допустимой строкой UTF-8 или допустимой строкой ISO-8859-1 или допустимой строкой во многих других кодировках. Вы можете декодировать его в любой из этих совместимых кодировок и получить тот же результат. Автор, явно выбравший UTF-8,… немного странный, но технически несущественный.

...