代码之家  ›  专栏  ›  技术社区  ›  Juan E.

Python的string.maketrans在家中工作,但在Google应用程序引擎上失败

  •  5
  • Juan E.  · 技术社区  · 16 年前

    我在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中尝试时,出现以下错误:

    信息2009-12-03 20:04:02904 dev_appserver.py:3038]“POST/backendsavenew HTTP/1.1”500- 信息2009-12-03 20:08:37649管理员:py:112]106 错误2009-12-03 20:08:37653 初始化 .py:388]maketrans参数必须具有相同的长度

    带有代码的python文件保存为UTF-8。

    提前感谢您的帮助。

    2 回复  |  直到 16 年前
        1
  •  15
  •   Community Mohan Dere    9 年前

    string.maketrans 和 string.translate 不适用于Unicode字符串。你的电话 将您提供的Unicode隐式转换为如下编码 utf-8 . 在里面 Ã¥ 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 -*-
    

    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?

        2
  •  1
  •   Kamil Szot    16 年前

    也许您可以对文件使用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)