我有一些使用Unicode标点符号的文本,例如左双引号,撇号的右单引号等等,我需要用ASCII。Python是否有一个包含这些字符的数据库,这些数据库具有明显的ASCII替代品,所以我可以做得比将它们全部都变成“”更好。?
我有一些使用Unicode标点符号的文本,例如左双引号,撇号的右单引号等等,我需要用ASCII。Python是否有一个包含这些字符的数据库,这些数据库具有明显的ASCII替代品,所以我可以做得比将它们全部都变成“”更好。?
Answers:
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/
s/ö/oe/
请先手动转换适用的字符(等),然后再使用清理其余字符unidecode
。
ä -> a
,ö -> o
是完全错误的,但它仍然比ae
和oe
在我的原始答案中,我还建议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
这些字符。
有趣的问题。
Google帮我找到了使用unicodedata模块描述的页面,如下所示:
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
在http://code.activestate.com/recipes/251871/上有关于此的更多讨论,其中包含NFKD解决方案以及一些转换表的方式,例如±=> +/-和其他非字母字符。