【问题标题】:Python's string.maketrans works at home but fails on Google App EnginePython string.maketrans 在家里工作,但在 Google App Engine 上失败
【发布时间】:2010-12-22 23:55:37
【问题描述】:

我在 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 参数必须具有相同的长度 信息 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。

提前感谢您的帮助。

【问题讨论】:

    标签: python google-app-engine internationalization translation


    【解决方案1】:

    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?

    【讨论】:

    • 我宁愿不向GAE添加新包来解决它,但我会研究Unidecode的代码。谢谢。
    • 我还需要删除一些字符。我将代码更改为“Unicode 方式”,并在字典中添加了一些对 None 的转换。
    【解决方案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。

    【讨论】:

    • 我想知道为什么我被否决了。该代码在 google appengine 上运行(我刚刚测试过)并执行了它应该做的事情。
    • 很遗憾,这个问题是错误的。正确的解决方案是使用 Unicode 进行文本处理并完全避免使用str.translate
    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 2014-05-12
    • 1970-01-01
    • 2015-08-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    相关资源
    最近更新 更多