python3 のrequest.args.getでUnicodeEncodeErrorが出た時の対処方法
ここで書いていることって、現役エンジニアの人にしてみればちゃんちゃらおかしい話なんだろうな、なんてことをいつも思いつつも、今日もメモします。
python3でのgetでこんなエラーが出てしまいハマりました。
問題のgetはこちら
word = request.args.get('word')
とにかく、日本語が通らないのでなんだこりゃって感じで苦戦すること2時間。。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 12-13: ordinal not in range(128)
とか
AttributeError: 'str' object has no attribute 'decode'
とかです。日本語がなんかダメなんですよね。。。というところまではわかったのですが、これの対策の苦戦した話のメモになります
対策
文字コードうんぬん周りなんだろーなってのは憶測がついたので、じゃあ、utf-8にすれば問題なくなるんだよね?とか、これで再度試してみたところ。。
word = request.args.get('word').decode('utf-8') ---------------------- AttributeError: 'str' object has no attribute 'decode'
・・もう何がなんだか汗
asciiとして認識されるは、utf-8とすると、こんなエラーになるわでほとほと疲れてきたところで以下を試したところ。。
うごいたw
word = urllib.parse.quote(request.args.get('word')) url = 'http://test-domain.local:5000/search/' + word res = urllib.request.urlopen(url)
詳しくはあとで調べるとして(きっと調べない)、get変数とかは必ず、urllib.parse.quoteで文字エンコードかけたほうがいいよおおって話でした。 urllib自体は、python3に標準実装されているはずなので、利用時は、import句で
import urllib.parse
を指定すれば、利用できると思います