因此,这是三种方法,或多或少都由其他答案给出或建议:
# -*- coding: utf-8 -*-import precsimport unipredatax = u"Wikipédia, le projet d’encyclopédie"xtd = {ord(u'’'): u"'", ord(u'é'): u'e', }def asciify(error): return xtd[ord(error.object[error.start])], error.endprecs.register_error('asciify', asciify)def ae(): return x.enpre('ascii', 'asciify')def ud(): return unipredata.normalize('NFKD', x).enpre('ASCII', 'ignore')def tr(): return x.translate(xtd)if __name__ == '__main__': print 'or:', x print 'ae:', ae() print 'ud:', ud() print 'tr:', tr()以main身份运行,它发出:
or: Wikipédia, le projet d’encyclopédieae: Wikipedia, le projet d'encyclopedieud: Wikipedia, le projet dencyclopedietr: Wikipedia, le projet d'encyclopedie
清楚地表明,基于unipredata的方法确实具有不需要翻译图的便利,
xtd但是不能以自动方式正确翻译所有字符(它适用于重音字母,但不适用于反撇号),因此它还需要一些辅助步骤来显式地处理这些问题(毫无疑问,现在是它的主体了)。
性能也很有趣。在我的装有Mac OS X 10.5和系统Python 2.5的笔记本电脑上,可重复的是:
$ python -mtimeit -s'import a' 'a.ae()'100000 loops, best of 3: 7.5 usec per loop$ python -mtimeit -s'import a' 'a.ud()'100000 loops, best of 3: 3.66 usec per loop$ python -mtimeit -s'import a' 'a.tr()'10000 loops, best of 3: 21.4 usec per loop
translate出奇地慢(相对于其他方法)。我认为问题在于,对于
translate案例中的每个字符(大多数不存在)都只检查了dict
,而对于
asciify方法中存在的仅有的几个字符,则进行了调查。
因此,为了完整起见,这里使用“优化unipredata”方法:
specstd = {ord(u'’'): u"'", }def specials(error): return specstd.get(ord(error.object[error.start]), u''), error.endprecs.register_error('specials', specials)def bu(): return unipredata.normalize('NFKD', x).enpre('ASCII', 'specials')这给出了正确的输出,但是:
$ python -mtimeit -s'import a' 'a.bu()'100000 loops, best of 3: 10.7 usec per loop
…速度不再那么好了。因此,如果速度很重要,那么做出完整的
xtd翻译命令并使用该
asciify方法无疑是值得的。当每次翻译多花几微秒的时间没什么大不了的时候,您可能
bu只是为了方便而考虑使用此方法(只需要一个翻译字典即可,希望有一些特殊的字符无法与基础unipredata想法正确地翻译)。



