Как я могу обратить декомпозицию Unicode, используя Python? - PullRequest
6 голосов
/ 15 января 2009

Используя Python 2.5, у меня есть некоторый текст, хранящийся в объекте Unicode:

Динис и Изабель, Ума Диффил супружеская и политическая

Это выглядит как разложенный Unicode . Есть ли в Python общий способ обратить декомпозицию в обратном направлении, поэтому я в итоге получаю:

Dinis e Isabel, Uma Difícil Relação супружеская и политическая

Ответы [ 3 ]

7 голосов
/ 15 января 2009

Я думаю, что вы ищете это:

>>> import unicodedata    
>>> print unicodedata.normalize("NFC",u"c\u0327")
ç
5 голосов
/ 15 января 2009

К сожалению, похоже, что в моем тексте (например) \ u00B8 (cedilla) вместо \ u0327 (cedilla) используется комбинация.

Эх, мерзко! Вы все еще можете сделать это автоматически, хотя процесс не будет полностью без потерь, так как включает декомпозицию совместимости (NFKD).

Нормализуйте U + 00B8 в NFKD, и вы получите пробел, за которым следует U + 0327. Затем вы можете сканировать строку в поисках любого символа пробела с последующим объединением символов и удалить пробел. Наконец, рекомендуйте NFC вместо этого комбинировать символы с предыдущим.

s= unicodedata.normalize('NFKD', s)
s= ''.join(c for i, c in enumerate(s) if c!=' ' or unicodedata.combining(s[i+1])==0)
s= unicodedata.normalize('NFC', s)
1 голос
/ 15 января 2009

Я не могу дать вам окончательный ответ на ваш вопрос, потому что я никогда не пробовал этого. Но в стандартной библиотеке есть модуль unicodedata . Он имеет две функции decomposition() и normalize(), которые могут вам здесь помочь.

Edit: убедитесь, что это действительно разложенный Unicode. Иногда существуют странные способы написания символов, которые нельзя напрямую выразить в кодировке. Например, "a, который должен анализироваться человеком или какой-либо специализированной программой как ä.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...