Преобразование шестнадцатеричного символа (лигатуры) в символ utf-8

У меня был текстовый контент, который конвертируется из PDF-файла. В тексте есть некоторые нежелательные символы, и я хочу преобразовать их в символы utf-8.

Например; "Искусственная иммунная система" преобразуется в "Искусственную иммунную систему". if преобразуется как один символ, и я использовал gdex чтобы узнать ascii значение персонажа, но я не знаю, как заменить его реальным значением во всем контенте.

1 ответ

Я предполагаю, что вы видите лигатуры - у профессиональных шрифтов есть глифы, которые объединяют несколько отдельных символов в один (лучше выглядящий) глиф. Поэтому вместо того, чтобы писать "f" и "i" как два глифа, у шрифта есть один глиф "fi". Сравните "fi" (две буквы) с "f" (одиночный глиф).

В Python вы можете использовать unicodedata модуль для манипулирования поздним текстом Unicode. Вы также можете использовать преобразование в нормальную форму NFKD для разделения лигатур:

>>> import unicodedata
>>> unicodedata.name(u'\uFB01')
'LATIN SMALL LIGATURE FI'
>>> unicodedata.normalize("NFKD", u'Arti\uFB01cial Immune System')
u'Artificial Immune System'

Поэтому нормализация ваших строк с помощью NFKD должна помочь вам в этом. Если вы обнаружите, что это разделяет слишком много, то мое лучшее предложение - создать небольшую таблицу сопоставления лигатур, которые вы хотите разделить, и заменить лигатуры вручную:

>>> ligatures = {0xFB00: u'ff', 0xFB01: u'fi'}
>>> u'Arti\uFB01cial Immune System'.translate(ligatures)
u'Artificial Immune System'

Обратитесь к статье Википедии, чтобы получить список лигатур в Юникоде.

Другие вопросы по тегам