在Python中预合成Unicode字符序列
我该如何将分解的Unicode字符序列,比如“拉丁小写字母E”加上“组合重音符”(或者说U+0075加U+0301),转换成预组合的形式:“拉丁小写字母E带重音”(或者说U+00E9),使用Python 2.5及以上的原生函数呢?
如果有关系的话,我是在Mac OS X(10.6.4)上,我看到过这个问题:使用Python-AppKit-ObjectiveC转换为预组合的Unicode字符串,但不幸的是,虽然描述的OS X原生CoreFoundation函数CFStringNormalize
不会失败或停止脚本执行,但它就是不做任何事情。我的意思不是说它不返回任何东西(它的返回类型是void - 它是在原地修改的)。我也尝试了所有可能的常量参数值,这些值指定了预组合或分解的标准形式或非标准形式。
所以我在寻找一种Python原生的方法来处理这种情况。
非常感谢你的阅读!
安德烈
1 个回答
10
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'