我有一些使用Unicode标点的文本,例如左双引号、右单引号作为撇号等等,我需要将其转换为ASCII格式。Python是否有这些字符的数据库并提供明显的ASCII替代方案,以便我不必把它们全部转换成“?”?
Unidecode 看起来是一个完整的解决方案。它将花式引号转换为ascii引号,带重音的拉丁字符转换为无重音,并尝试音译来处理没有ASCII等价物的字符。这样,当您需要通过传递给他们的文本使用遗留的7位ASCII系统时,用户就不必看到一堆问号了。
>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing
s/ö/oe/
)再使用unidecode
进行清理。 - alexisä -> a
和 ö -> o
是正确的替换方式,但使用 ae
和 oe
仍然不如前者好。请注意,这并不是错误。 - Antti Haapala -- Слава Україні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
来处理这些字符。
有趣的问题。
谷歌帮我找到了这个页面,它描述了使用unicodedata模块的方法如下:
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')