在Python中预编写Unicode字符序列

and*_*reb 4 python unicode macos

如何转换分解的unicode字符序列,如"LATIN SMALL LETTER E"+"COMBINING ACUTE ACCENT"(或U + 0075 + U + 0301),使它们成为预组合形式:"带有急性的拉丁文小写字母E"(或U + 00E9)使用原生Python 2.5+功能?

如果它很重要,我在Mac OS X(10.6.4)上,我已经看到了使用Python-AppKit-ObjectiveC转换为预组合Unicode字符串的问题,但不幸的是,所描述的OS X本机CoreFoundation函数CFStringNormalize没有失败或停止脚本执行它只是没有做任何事情.并且由此我并不意味着它不返回任何东西(它的返回类型是无效的 - 它在适当的位置变异).我还尝试了常量参数的所有可能值,这些参数指定了规范或非规范形式的预分解或分解.

这就是我正在寻找处理这种情况的Python本机方法的原因.

非常感谢您的阅读!

安德烈

unu*_*tbu 9

import unicodedata as ud

astr=u"\N{LATIN SMALL LETTER E}" + u"\N{COMBINING ACUTE ACCENT}"
combined_astr=ud.normalize('NFC',astr)
Run Code Online (Sandbox Code Playgroud)

'NFC'告诉ud.normalize应用规范分解('NFD'),然后组合预组合字符:

print(ud.name(combined_astr))
# LATIN SMALL LETTER E WITH ACUTE
Run Code Online (Sandbox Code Playgroud)

他们都打印相同:

print(astr)
# e?
print(combined_astr)
# é
Run Code Online (Sandbox Code Playgroud)

但他们的代表是不同的:

print(repr(astr))
# u'e\u0301'
print(repr(combined_astr))
# u'\xe9'
Run Code Online (Sandbox Code Playgroud)

而且,他们的编码utf_8(也不奇怪)也是不同的:

print(repr(astr.encode('utf_8')))
# 'e\xcc\x81'
print(repr(combined_astr.encode('utf_8')))
# '\xc3\xa9'
Run Code Online (Sandbox Code Playgroud)