代码之家  ›  专栏  ›  技术社区  ›  joeforker

python的“这个unicode最好的ASCII”数据库在哪里?

  •  81
  • joeforker  · 技术社区  · 16 年前

    我有一些使用Unicode标点的文本,比如左双引号、右单引号和撇号等等,我需要它是ASCII格式的。python是否有一个包含这些字符的数据库,其中包含明显的ASCII替换字符,这样我就可以更好地将它们全部转换为“?”?

    4 回复  |  直到 8 年前
        1
  •  87
  •   joeforker    16 年前

    Unidecode 看起来是一个完整的解决方案。它将花哨的引号转换为ASCII引号,将重音的拉丁字符转换为非重音,甚至尝试音译处理没有ASCII等价物的字符。这样你的用户就不必看到一堆?当你必须通过传统的7位ASCII系统传递他们的文本时。

    >>> from unidecode import unidecode
    >>> print unidecode(u"\u5317\u4EB0")
    Bei Jing 
    

    http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/

        2
  •  24
  •   Mike Spross Alex Martelli    16 年前

    在我最初的回答中,我也建议 unicodedata.normalize . 但是,我决定测试一下,结果发现它不适用于Unicode引号。它能很好地翻译重音Unicode字符,所以我猜 unicodedata.normalize 是使用 unicode.decomposition 函数,这让我相信它可能只能处理字母和发音标记组合的Unicode字符,但我不是Unicode规范的专家,所以我可以充满热情…

    在任何情况下,您都可以使用 unicode.translate 处理标点符号。这个 translate 方法将Unicode序号字典转换为Unicode序号,因此可以创建一个将仅Unicode标点转换为与ASCII兼容标点的映射:

    'Maps left and right single and double quotation marks'
    'into ASCII single and double quotation marks'
    >>> punctuation = { 0x2018:0x27, 0x2019:0x27, 0x201C:0x22, 0x201D:0x22 }
    >>> teststring = u'\u201Chello, world!\u201D'
    >>> teststring.translate(punctuation).encode('ascii', 'ignore')
    '"hello, world!"'
    

    如果需要,您可以添加更多的标点符号映射,但我认为您不必担心处理每个Unicode标点符号字符。如果你 需要处理重音符号和其他音调符号,您仍然可以使用 unicodedata.normalize 处理那些角色。

        3
  •  19
  •   easel    16 年前

    有趣的问题。

    谷歌帮我找到 this page 说明使用 unicodedata module 如下所示:

    import unicodedata
    unicodedata.normalize('NFKD', title).encode('ascii','ignore')
    
        4
  •  3
  •   Andrew Dalke    16 年前

    有关此问题的其他讨论,请访问 http://code.activestate.com/recipes/251871/ 它有nfkd解决方案和一些转换表的方法,例如_±=>+/-和其他非字母字符。