我有一些使用Unicode标点符号的文本,如左双引号,右引号为撇号,等等,我需要用ASCII格式。 Python是否有一个具有明显ASCII替代品的这些字符的数据库,所以我可以把它们全部变成“?”。 ?
答案 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解决方案以及一些转换表的方法,例如±=> +/-和其他非字母字符。