【问题标题】:Where is Python's "best ASCII for this Unicode" database? [closed]Python 的“这个 Unicode 的最佳 ASCII”数据库在哪里? [关闭]
【发布时间】:2010-10-23 09:51:01
【问题描述】:

我有一些使用 Unicode 标点符号的文本,比如左双引号、右单引号作为撇号等等,我需要它的 ASCII 格式。 Python 是否有一个包含这些字符的数据库以及明显的 ASCII 替代品,所以我可以做得比将它们全部变成“?”更好。 ?

【问题讨论】:

标签: python unicode ascii


【解决方案1】:

有趣的问题。

Google 帮我找到了this page,它使用unicodedata module 描述如下:

import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')

【讨论】:

    【解决方案2】:

    在我原来的回答中,我还建议了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】:

      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/

      【讨论】:

      • 嗯.. 德语变音符号被转换为它们的基本字符,而不是例如ö=oe、ä=ae 等
      • @ThiefMaster 这些等价物是否适用于所有语言?也许 Unidecode 正在寻求最小的公分母。
      • Unidecode 肯定适用于独立于语言的解决方案。对于以德语为中心的解决方案,请先手动转换适用的字符(s/ö/oe/ 等),然后再使用unidecode 清理其余字符。
      • 确实,以芬兰语为例,虽然ä -> aö -> o 是完全错误的,但它仍然比aeoe 更可取
      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2012-02-28
      • 1970-01-01
      相关资源
      最近更新 更多