我在 Google AppEngine (Python SDK) 中有这段代码:
from string import maketrans
intab = u"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ".encode('latin1')
outtab = u"aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn".encode('latin1')
logging.info(len(intab))
logging.info(len(outtab))
trantab = maketrans(intab, outtab)
当我在交互式控制台中运行代码时没有问题,但是当我在 GAE 中尝试时出现以下错误:
引发 ValueError,“maketrans 参数必须具有相同的长度” ValueError:maketrans 参数必须具有相同的长度 INFO 2009-12-03 20:04:02,904 dev_appserver.py:3038] "POST/backendsavenew HTTP/1.1"500 - 信息 2009-12-03 20:08:37,649 admin.py:112] 106 信息 2009-12-03 20:08:37,651 admin.py:113] 53 错误 2009-12-03 20:08:37,653 init.py:388] maketrans 参数必须具有相同的长度
我不明白为什么 intab 的大小会增加一倍。 带有代码的python文件保存为UTF-8。
在此先感谢您的帮助。
最佳答案
string.maketrans
和 string.translate
不适用于 Unicode 字符串。您对 string.maketrans
的调用将隐含地将您提供的 Unicode 转换为类似 utf-8
的编码。在 utf-8
中,å
比 ASCII a
占用更多空间。 string.maketrans
看到 len(str(argument))
这对于你的两个字符串是不同的。
有一个 Unicode 翻译,但对于您的用例(将 Unicode 转换为 ASCII,因为您系统的某些部分无法处理 Unicode)您应该使用 http://pypi.python.org/pypi/Unidecode . Unidecode 在将 Unicode 字符音译为合理的 ASCII 方面非常聪明,涵盖的字符比您的示例中多得多。
您应该将您的 Python 代码保存为 utf-8,但请确保您添加了魔法,这样 Python 就不必假设您使用了系统的默认编码。此行应该是 Python 文件的第一行或第二行:
# -*- coding: utf-8 -*-
将文本处理为 Unicode 而不是二进制字符串有很多优点。这是做你想做的事情的 Unicode 方式:
intab = u"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ"
outtab = u"aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn"
trantab = dict((ord(a), b) for a, b in zip(intab, outtab))
translated = intab.translate(trantab)
translated == outtab # True
另见 Where is Python's "best ASCII for this Unicode" database?
关于Python 的 string.maketrans 在家工作但在 Google App Engine 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1842692/