我在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。
提前感谢您的帮助。
答案 0 :(得分: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 -*-
将文本处理为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
答案 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。