Предварительно составить последовательности символов Unicode в Python - PullRequest
4 голосов
/ 02 октября 2010

Как я могу преобразовать разложенные последовательности символов Юникода, такие как «LATIN SMALL LETTER E» + «COMBINING ACUTE ACCENT» (или U + 0075 + U + 0301), чтобы они стали предварительно составленной формой: «LATIN SMALL LETTER E WITH ACUTE» ( или U + 00E9) с использованием собственных функций Python 2.5+?

Если это имеет значение, я нахожусь на Mac OS X (10.6.4), и я видел вопрос Преобразование в предварительно составленную строку Unicode с использованием Python-AppKit-ObjectiveC , но, к сожалению, в то время как описанная OS X родная CoreFoundation Функция CFStringNormalize не дает сбоя и не останавливает выполнение скрипта, просто ничего не делает. И этим я не имею в виду, что он ничего не возвращает (его тип возврата void - он мутирует на месте). Я также попробовал все возможные значения для константного параметра, который задает предварительную композицию или декомпозицию в канонической или неканонической формах.

Вот почему я ищу собственный метод Python для обработки этого случая.

Большое спасибо за чтение!

Андре

1 Ответ

9 голосов
/ 02 октября 2010
import unicodedata as ud

astr=u"\N{LATIN SMALL LETTER E}" + u"\N{COMBINING ACUTE ACCENT}"
combined_astr=ud.normalize('NFC',astr)

'NFC' говорит ud.normalize применить каноническое разложение ('NFD'), затем составьте предварительно объединенные символы:

print(ud.name(combined_astr))
# LATIN SMALL LETTER E WITH ACUTE

Они оба печатают одинаково:

print(astr)
# é
print(combined_astr)
# é

Но их респоры разные:

print(repr(astr))
# u'e\u0301'
print(repr(combined_astr))
# u'\xe9'

И их кодировки, скажем utf_8, (что неудивительно) тоже различны:

print(repr(astr.encode('utf_8')))
# 'e\xcc\x81'
print(repr(combined_astr.encode('utf_8')))
# '\xc3\xa9'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...