Python的string.maketrans在本地正常但在Google App Engine上失败

5 投票
2 回答
3159 浏览
提问于 2025-04-15 16:39

我在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 错误 2009-12-03 20:08:37,653 init.py:388] maketrans的参数长度必须相同

我搞不清楚为什么intab的大小会翻倍。 保存这段代码的Python文件是UTF-8格式。

提前感谢任何帮助。

2 个回答

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编码哦。

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

另请参见 Python 的“最佳 ASCII 对应 Unicode”数据库在哪里?

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

撰写回答