Python的“这个Unicode的最佳ASCII”数据库在哪里?

时间:2009-05-03 03:46:17

标签: python unicode ascii

我有一些使用Unicode标点符号的文本,如左双引号,右引号为撇号,等等,我需要用ASCII格式。 Python是否有一个具有明显ASCII替代品的这些字符的数据库,所以我可以把它们全部变成“?”。 ?

4 个答案:

答案 0 :(得分:87)

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/

答案 1 :(得分:24)

在我的原始答案中,我还建议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来处理这些字符。

答案 2 :(得分:19)

有趣的问题。

Google帮助我找到this page,其中使用了unicodedata module作为以下内容:

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

答案 3 :(得分:3)

http://code.activestate.com/recipes/251871/进行了额外的讨论,其中包含NFKD解决方案以及一些转换表的方法,例如±=> +/-和其他非字母字符。