如何转换分解的unicode字符序列,如“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)上,我看到了问题Converting to Precomposed Unicode String using Python-AppKit-ObjectiveC但不幸的是,所描述的OS X本机CoreFoundation函数CFStringNormalize
没有失败或停止脚本执行它只是没有做任何事情。
并且由此我并不意味着它不返回任何东西(它的返回类型是无效的 - 它在适当的位置变异)。我还尝试了常量参数的所有可能值,该参数指定规范或非规范形式的预分解或分解。
这就是为什么我在寻找处理这种情况的Python原生方法。
非常感谢您的阅读!
安德烈
答案 0 :(得分: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'