2010-10-02 39 views
4

如何轉換像「拉丁小字母E」+「組合ACUTE ACCENT」(或U + 0075 + U + 0301)這樣的分解的Unicode字符序列,使它們成爲預分解形式:「LATIN SMALL LETTER E WITH ACUTE「(或U + 00E9)使用本機Python 2.5+函數?在Python中預編碼Unicode字符序列

如果有問題,我在Mac OS X(10.6.4)上,我看到Converting to Precomposed Unicode String using Python-AppKit-ObjectiveC這個問題,但不幸的是,雖然所描述的OS X原生CoreFoundation函數CFStringNormalize不會失敗或暫停腳本執行,但它不會做任何事情。因此,我並不是說它不會返回任何東西(它的返回類型是無效的 - 它在原地發生變化)。我也嘗試了常量參數的所有可能的值,這些常量參數指定以規範或非規範形式的預組合或分解。

這就是爲什麼我正在尋找一種處理這種情況的Python本地方法。

非常感謝您的閱讀!

安德烈

+0

相關:http://stackoverflow.com/questions/446222/how-do-i-reverse -unicode-decomposition-python – kennytm 2010-10-02 13:40:49

+0

也感謝你Kenny,添加了交叉引用。 – andreb 2010-10-02 14:13:59

回答

9
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' 
+0

從你的repr例子看,這看起來完全像我需要的。感謝您花時間回覆!接受答案。 – andreb 2010-10-02 14:06:49