【问题标题】:How do I reverse Unicode decomposition using Python?如何使用 Python 反转 Unicode 分解?
【发布时间】: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 unicode


    【解决方案1】:

    我想你正在寻找这个:

    >>> import unicodedata    
    >>> print unicodedata.normalize("NFC",u"c\u0327")
    ç
    

    【讨论】:

    • 是的,这是可行的——假设我确实已经分解了 unicode。不幸的是,我的文本中似乎实际上有(例如) \u00B8 (cedilla)而不是 \u0327 (combining cedilla)。看起来我需要将这些字符映射到它们的组合等价物或完全剥离它们。谢谢。
    【解决方案2】:

    不幸的是,我的文本中似乎实际上有(例如)\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)
    

    【讨论】:

      【解决方案3】:

      对于您的问题,我真的无法给出明确的答案,因为我从未尝试过。但是标准库中有一个unicodedata module。它有两个函数decomposition()normalize() 可能对你有所帮助。

      编辑:确保它确实是分解的 unicode。有时有一些奇怪的方法可以编写无法直接用编码表示的字符。就像"a 一样,它意味着由人类或一些专门的程序在心理上解析为ä

      【讨论】:

      • 你说得对,它实际上不是正确分解的 unicode - 请参阅我对 Rafał Dowgird 回答的评论。
      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2019-08-07
      • 2011-12-14
      相关资源
      最近更新 更多