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

Jua*_* E. 5 python google-app-engine translation internationalization

我在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)
Run Code Online (Sandbox Code Playgroud)

当我在交互式控制台中运行代码时我没有问题,但是当我在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.

在此先感谢您的帮助.

joe*_*ker 15

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 -*-
Run Code Online (Sandbox Code Playgroud)

将文本处理为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
Run Code Online (Sandbox Code Playgroud)

另请参见Python的"此Unicode的最佳ASCII"数据库在哪里?

另请参见如何使用str.translate处理Unicode字符串?