Я пишу лексический анализатор для текста в Юникоде. Многие символы Юникода требуют нескольких кодовых точек (даже после канонической композиции). Например, tuple(map(ord, unicodedata.normalize('NFC', 'ā́')))
оценивает (257, 769)
. Как я могу узнать, где граница между двумя символами? Кроме того, я хотел бы сохранить ненормализованную версию текста. Мой вход гарантированно будет Unicode.Учитывая список кодов Unicode, как их разбить на список символов Unicode?
До сих пор, это то, что у меня есть:
from unicodedata import normalize
def split_into_characters(text):
character = ""
characters = []
for i in range(len(text)):
character += text[i]
if len(normalize('NFKC', character)) > 1:
characters.append(character[:-1])
character = character[-1]
if len(character) > 0:
characters.append(character)
return characters
print(split_into_characters('Puélla in vī́llā vīcī́nā hábitat.'))
Это неправильно печатает следующее:
['P', 'u', 'é', 'l', 'l', 'a', ' ', 'i', 'n', ' ', 'v', 'ī', '́', 'l', 'l', 'ā', ' ', 'v', 'ī', 'c', 'ī', '́', 'n', 'ā', ' ', 'h', 'á', 'b', 'i', 't', 'a', 't', '.']
Я ожидаю, что это напечатать следующее:
['P', 'u', 'é', 'l', 'l', 'a', ' ', 'i', 'n', ' ', 'v', 'ī́', 'l', 'l', 'ā', ' ', 'v', 'ī', 'c', 'ī́', 'n', 'ā', ' ', 'h', 'á', 'b', 'i', 't', 'a', 't', '.']
О, сладкий. У обоих есть вполне разрешительные лицензии. Отлично! Благодаря! –