【发布时间】:2009-01-15 10:08:25
【问题描述】:
使用 Python 2.5,我将一些文本存储在 unicode 对象中:
Dinis e Isabel, uma difı´cil relac¸a~o 婚姻和政治
这似乎是decomposed Unicode。 Python中是否有一种通用的方法来反转分解,所以我最终得到:
Dinis e Isabel, uma difícil relação 婚姻与政治
【问题讨论】:
使用 Python 2.5,我将一些文本存储在 unicode 对象中:
Dinis e Isabel, uma difı´cil relac¸a~o 婚姻和政治
这似乎是decomposed Unicode。 Python中是否有一种通用的方法来反转分解,所以我最终得到:
Dinis e Isabel, uma difícil relação 婚姻与政治
【问题讨论】:
我想你正在寻找这个:
>>> import unicodedata
>>> print unicodedata.normalize("NFC",u"c\u0327")
ç
【讨论】:
不幸的是,我的文本中似乎实际上有(例如)\u00B8 (cedilla) 而不是 \u0327 (combining cedilla)。
哎呀,讨厌!您仍然可以自动执行此操作,尽管该过程不会完全无损,因为它涉及兼容性分解 (NFKD)。
将 U+00B8 标准化为 NFKD,您将得到一个空格,然后是 U+0327。然后,您可以扫描字符串以查找任何空格后跟组合字符的情况,然后删除空格。最后重构为 NFC,将组合字符放在前一个字符上。
s= unicodedata.normalize('NFKD', s)
s= ''.join(c for i, c in enumerate(s) if c!=' ' or unicodedata.combining(s[i+1])==0)
s= unicodedata.normalize('NFC', s)
【讨论】:
对于您的问题,我真的无法给出明确的答案,因为我从未尝试过。但是标准库中有一个unicodedata module。它有两个函数decomposition() 和normalize() 可能对你有所帮助。
编辑:确保它确实是分解的 unicode。有时有一些奇怪的方法可以编写无法直接用编码表示的字符。就像"a 一样,它意味着由人类或一些专门的程序在心理上解析为ä。
【讨论】: