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


85

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


21
你是勇敢的战士。Unicode是python的主要敌人。
David Berger,2009年

Answers:


89

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/


3
HM ..德语元音变音被转换为它们的基字符,而不是例如O = OE,A = AE,等
ThiefMaster

4
@ThiefMaster这些等效语言在所有语言中都适用吗?也许Unidecode会使用最低的公分母。
Mark Ransom

Unidecode最肯定适用于与语言无关的解决方案。对于以德国为中心的解决方案,s/ö/oe/请先手动转换适用的字符(等),然后再使用清理其余字符unidecode
alexis

4
确实,例如在芬兰,虽然ä -> aö -> o是完全错误的,但它仍然比aeoe
Antti Haapala

25

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


21

有趣的问题。

Google帮我找到了使用unicodedata模块描述的页面,如下所示:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.