【发布时间】:2010-10-23 09:51:01
【问题描述】:
我有一些使用 Unicode 标点符号的文本,比如左双引号、右单引号作为撇号等等,我需要它的 ASCII 格式。 Python 是否有一个包含这些字符的数据库以及明显的 ASCII 替代品,所以我可以做得比将它们全部变成“?”更好。 ?
【问题讨论】:
我有一些使用 Unicode 标点符号的文本,比如左双引号、右单引号作为撇号等等,我需要它的 ASCII 格式。 Python 是否有一个包含这些字符的数据库以及明显的 ASCII 替代品,所以我可以做得比将它们全部变成“?”更好。 ?
【问题讨论】:
有趣的问题。
Google 帮我找到了this page,它使用unicodedata module 描述如下:
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 引号,将带重音的拉丁字符转换为不带重音的字符,甚至尝试音译来处理没有 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 更可取