Python的“最佳ASCII对应Unicode”数据库在哪里?
我有一些文本里面用到了Unicode符号,比如左双引号、右单引号(表示撇号)等等,我需要把它们转换成ASCII格式。请问Python有没有一个字符库,可以告诉我这些符号对应的ASCII替代字符,这样我就能把它们转换得更好,而不是全部变成“?”呢?
3 个回答
这个问题很有意思。
我在谷歌上找到了一些资料,这个页面讲述了如何使用unicodedata模块,具体内容如下:
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
在我最初的回答中,我也提到了 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
来处理这些字符。
Unidecode 看起来是个很不错的解决方案。它可以把那些花哨的引号转换成普通的引号,把带重音的拉丁字母变成没有重音的字母,甚至还会尝试把一些没有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/