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

87

我有一些使用Unicode标点的文本,例如左双引号、右单引号作为撇号等等,我需要将其转换为ASCII格式。Python是否有这些字符的数据库并提供明显的ASCII替代方案,以便我不必把它们全部转换成“?”?


2
可能会对此感兴趣的人:Python中去除Unicode字符串中重音符号的最佳方法是什么? - Martin Thoma
3个回答

90

Unidecode 看起来是一个完整的解决方案。它将花式引号转换为ascii引号,带重音的拉丁字符转换为无重音,并尝试音译来处理没有ASCII等价物的字符。这样,当您需要通过传递给他们的文本使用遗留的7位ASCII系统时,用户就不必看到一堆问号了。

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

Python中的Unicode转换


3
嗯...德语中的umlauts会被转换为它们的基本字符,而不是像ö=oe、ä=ae等这样。 - ThiefMaster
5
@ThiefMaster这些等价物在所有语言中都是真实的吗?也许Unidecode正在寻求最低公共分母。 - Mark Ransom
Unidecode肯定是采用独立于语言的解决方案。对于德语为中心的解决方案,在清理剩余部分之前,手动转换适用字符(例如s/ö/oe/)再使用unidecode进行清理。 - alexis
4
在芬兰语中,虽然 ä -> aö -> o 是正确的替换方式,但使用 aeoe 仍然不如前者好。请注意,这并不是错误。 - Antti Haapala -- Слава Україні

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


22

有趣的问题。

谷歌帮我找到了这个页面,它描述了使用unicodedata模块的方法如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接