2

我正在编写一些简单的脚本来将文本与 rot13 相互转换。所以在适当的类里面我有这个:

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

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

它可以很好地获取参数“文本”,但在 .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)

我的代码有什么问题?

4

1 回答 1

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

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

translate 的 Unicode 版本需要从 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 字符串或无(删除)。因此,我将 translate_to 的默认值更改为 Unicode 文字。例如:

>>> translate_non_alphanumerics(u'<foo>!', u'bad') u'badfoobadbad'
于 2012-05-28T10:31:17.943 回答