Преобразование шестнадцатеричного символа (лигатуры) в символ 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'
Обратитесь к статье Википедии, чтобы получить список лигатур в Юникоде.