Python的string.maketrans在家工作但在Google App Engine上失败

时间:2009-12-03 20:29:45

标签: python google-app-engine internationalization translation

我在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 - INFO 2009-12-03 20:08:37,649 admin.py:112] 106 INFO 2009-12-03 20:08:37,651 admin.py:113] 53 ERROR 2009-12-03 20:08:37,653 init .py:388] maketrans参数必须具有相同的长度

我无法弄清楚为什么它的尺寸增加了一倍。 带代码的python文件保存为UTF-8。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:15)

string.maketransstring.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?

另见How do I get str.translate to work with Unicode strings?

答案 1 :(得分:1)

也许你可以使用iso-8859-1编码代替utf-8

# -*- coding: iso-8859-1 -*-
from string import maketrans 
import logging

intab =  "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ"
outtab = "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn"
logging.info(len(intab))
logging.info(len(outtab))
trantab = maketrans(intab, outtab)

请记住在保存此python源文件时在文本编辑器中选择iso-8859-1。