【问题标题】:Python and character normalizationPython 和字符规范化
【发布时间】:2011-05-08 22:28:03
【问题描述】:

你好 我从包含特殊字符(例如 u"ıöüç")的外部来源检索基于文本的 utf8 数据,而我想将它们标准化为英语,例如 "ıöüç" -> "iouc" 。实现这一目标的最佳方法是什么?

【问题讨论】:

  • 搜索和替换也许,你必须有一个完整的特殊字符数组。

标签: python django utf-8 diacritics transliteration


【解决方案1】:
import unicodedata
unicodedata.normalize()

http://docs.python.org/library/unicodedata.html

【讨论】:

  • 我有点困惑:我试过 print unicodedata.normalize('NFKD', u"ıöüç") 并且输出再次是:ıöüç
  • 尝试其他有效值“NFC”、“NFKC”、“NFD”和“NFKD”。
  • 我相当肯定这与提问者所寻找的操作不同。但是,是的,这是 unicode 规范化。他所问的问题通常不会被这样称呼。
  • 对。我认为它被称为transliteration
【解决方案2】:

我推荐使用Unidecode module:

>>> from unidecode import unidecode
>>> unidecode(u'ıöüç')
'iouc'

注意你如何给它一个 unicode 字符串并输出一个字节字符串。输出保证为ASCII。

【讨论】:

    【解决方案3】:

    这完全取决于您想在音译结果方面走多远。如果您想将所有内容一直转换为 ASCII(αβγabg),那么 unidecode 是最好的选择。

    如果您只想从重音字母中删除重音,那么您可以尝试使用规范化形式 NFKD 分解您的字符串(这会将重音字母 á 转换为普通字母 a 后跟 U+0301 COMBINING ACUTE ACCENT),然后丢弃重音符号(属于 Unicode character class Mn — "Mark, nonspacing")。

    import unicodedata
    
    def remove_nonspacing_marks(s):
        "Decompose the unicode string s and remove non-spacing marks."
        return ''.join(c for c in unicodedata.normalize('NFKD', s)
                       if unicodedata.category(c) != 'Mn')
    

    【讨论】:

      【解决方案4】:

      我找到的最简单的方法:

      unicodedata.normalize('NFKD', s).encode("ascii", "ignore")

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 2010-11-25
        • 2010-10-10
        • 2012-05-31
        • 2018-04-16
        • 2018-09-29
        • 2020-02-12
        • 2012-04-25
        • 2013-06-29
        相关资源
        最近更新 更多