在Python中预编写Unicode字符序列

时间:2010-10-02 12:57:12

标签: python macos unicode

如何转换分解的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原生方法。

非常感谢您的阅读!

安德烈

1 个答案:

答案 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'