Python的string.maketrans在本地正常但在Google App Engine上失败
我在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 个回答
也许你可以试试用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编码哦。
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