Google App Engine和string.translate不起作用

时间:2012-05-28 10:30:28

标签: python google-app-engine

我正在编写一些简单的脚本来将文本与rot13进行翻译。所以在appriopriate课程中我有这个:

def post(self): 
dict = string.maketrans("ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz", "NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")

code = self.request.get("text")
code = string.translate(code, dict)

它获取参数“text”正常但在.translate它会因内部服务器错误而爆炸:

      File "<mypath>\main.py", line 46, in post
    code = string.translate(code, dict)
  File "C:\Python27\lib\string.py", line 498, in translate
    return s.translate(table + s[:0])
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 128: ordinal not in range(128)

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

a = "This is a string".encode("rot13")
b = a.decode("rot13")
print b

它的python; D它完全符合你的要求。

  

Unicode版本的translate需要Unicode的映射   序数(您可以使用ord检索单个字符)   Unicode序数。如果要删除字符,请映射到无。

     

我改变了你的函数来构建一个映射每个序数的字典   你要翻译的序数的字符:

def translate_non_alphanumerics(to_translate, translate_to=u'_'):
    not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
    translate_table = dict((ord(char), translate_to) for char in not_letters_or_digits)
    return to_translate.translate(translate_table)

>>> translate_non_alphanumerics(u'<foo>!') u'_foo__'
     

编辑:事实证明,翻译映射必须从Unicode序号映射   (通过ord)到另一个Unicode序号,Unicode字符串或None   (删除)。因此我将translate_to的默认值更改为   是一个Unicode文字。例如:

>>> translate_non_alphanumerics(u'<foo>!', u'bad') u'badfoobadbad'