2016-03-10 24 views
2

我正在爲Unicode文本編寫一個詞法分析器。許多Unicode字符需要多個代碼點(即使在規範組合之後)。例如,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', '.'] 

回答

4

邊界感知字符之間可以用Unicode的Grapheme Cluster Boundary algorithm來標識。 Python的unicodedata模塊沒有該算法的必要數據(Grapheme_Cluster_Break屬性),但完整的實現可以在像PyICUuniseg這樣的庫中找到。

+0

哦,甜美。這兩個都有相當寬鬆的許可證。完善!謝謝! –

相關問題