代码之家  ›  专栏  ›  技术社区  ›  Tomasz Wysocki

用等价的ASCII替换特殊字符

  •  24
  • Tomasz Wysocki  · 技术社区  · 15 年前

    是否有任何lib可以将特殊字符替换为等价的ASCII字符,例如:

    "Cześć"
    

    到:

    "Czesc"
    

    我当然可以创建地图:

    {'ś':'s', 'ć': 'c'}
    

    并使用一些替换功能。但我不想将所有等价物硬编码到我的程序中,如果有一些函数已经做到了这一点的话。

    5 回复  |  直到 11 年前
        1
  •  28
  •   nosklo    15 年前
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import unicodedata
    text = u'Cześć'
    print unicodedata.normalize('NFD', text).encode('ascii', 'ignore')
    
        2
  •  14
  •   dan04    15 年前

    您可以通过以下方式获得大部分信息:

    import unicodedata
    
    def strip_accents(text):
        return ''.join(c for c in unicodedata.normalize('NFKD', text) if unicodedata.category(c) != 'Mn')
    

    不幸的是,存在无法分解成ASCII字母+组合符号的重音拉丁字母。你必须手动处理它们。这些包括:

    • γ射线
    • γ射线衍射
    • γ射线
    • 第二代
    • γ-π
    • γ射线
    • α°
    • γ射线
    • 第二代
    • 第二章
    • 第二章
    • α-εf
        3
  •  3
  •   Grzegorz Skrzypczak    14 年前

    我是这样做的:

    POLISH_CHARACTERS = {
        50309:'a',50311:'c',50329:'e',50562:'l',50564:'n',50099:'o',50587:'s',50618:'z',50620:'z',
        50308:'A',50310:'C',50328:'E',50561:'L',50563:'N',50067:'O',50586:'S',50617:'Z',50619:'Z',}
    
    def encodePL(text):
        nrmtxt = unicodedata.normalize('NFC',text)
        i = 0
        ret_str = []
        while i < len(nrmtxt):
            if ord(text[i])>128: # non ASCII character
                fbyte = ord(text[i])
                sbyte = ord(text[i+1])
                lkey = (fbyte << 8) + sbyte
                ret_str.append(POLISH_CHARACTERS.get(lkey))
                i = i+1
            else: # pure ASCII character
                ret_str.append(text[i])
            i = i+1
        return ''.join(ret_str)
    

    执行时:

    encodePL(u'ąćęłńóśźż ĄĆĘŁŃÓŚŹŻ')
    

    它将产生如下输出:

    u'acelnoszz ACELNOSZZ'
    

    这对我来说很好。

        4
  •  3
  •   Marcin Wojnarski    11 年前

    试试 trans 包裹。看起来很有前途。支持抛光。

        5
  •  1
  •   John Machin Santi    15 年前

    unicodedata.normalize技巧最好描述为half assci。这里是一个 robust approach 其中包括一张不分解的字母地图。注意注释中的其他地图条目。