我正在编写一些简单的脚本来将文本与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)
我的代码出了什么问题?
答案 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'