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 の序数へのマッピングが必要です。文字を削除する場合は、None にマップします。

関数を変更して、すべての文字の序数を翻訳先の序数にマッピングする辞書を作成しました。

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__'

編集: 変換マッピングは、(ord を介して) Unicode 序数から別の Unicode 序数、Unicode 文字列、または None (削除する) のいずれかにマップする必要があることが判明しました。したがって、translate_to のデフォルト値を Unicode リテラルに変更しました。例えば:

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