Преобразование шестнадцатеричного символа (лигатуры) в символ utf-8 - PullRequest
6 голосов
/ 07 февраля 2012

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

Например;«Искусственная иммунная система» преобразуется в «Arti if cial Immune System». if конвертируется как один символ, и я использовал gdex, чтобы узнать значение ascii символа, но я не знаю, как заменить его реальным значением во всем контенте.

1 Ответ

9 голосов
/ 07 февраля 2012

Я думаю, вы видите лигатуры - у профессиональных шрифтов есть глифы, которые объединяют несколько отдельных символов в один (лучше выглядящий) глиф.Поэтому вместо того, чтобы писать «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'

См. Статью Википедии, чтобы получить список лигатур в Unicode .

...