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

标签 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 - 信息 2009-12-03 20:08:37,649 admin.py:112] 106 信息 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。

在此先感谢您的帮助。

最佳答案

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?

关于Python 的 string.maketrans 在家工作但在 Google App Engine 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1842692/

相关文章:

python - 如何添加不等长列表中的每个元素?

python - 在 Google App Engine 中,如何选择不存在属性的实体?

java - 使用 Java 设置 App Engine 数据存储区的光标

ruby-on-rails-3 - 使用simple_form的嵌套模型的i18n标签

node.js - Node INTL 语言环境排序规则

python - 从 FTP 检索文件并直接写入 zip 存档

python - 如何返回不包括某些列的新数据框?

python - 按组在日期范围内高效的 p​​andas 滚动聚合 - Python 2.7 Windows - Pandas 0.19.2

java - 在 App Engine 上录制声音的最佳方式

iphone - genstrings 工具抛出异常,在解析 XCode 项目时中止