Python 2.x の話。3.x は知らない。
args = {"foo": "bar", "hoge": "fuga", "piyo": 123}
を foo=bar&hoge=fuga&piyo=123 にしたい。
そういうときは urllib.urlencode を使って
import urllib print urllib.urlencode(args)
とするみたいなのだが、unicode が混じってると使えない。
>>> args = {"foo": "bar", "hoge": u"ほげ", "piyo": 123}
>>> urllib.urlencode(args)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/6.0.0/lib/python2.6/urllib.py", line 1268, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
エラーメッセージで検索すると、
urllib.urlencode(dict([k, v.encode('utf-8')] for k, v in args.items()))
でいいと書いてあった。
unicode か str だけだったらこれでいいんだけど、今回のように数字とかが混じってると .encode メソッドが無いよと怒られるので、
urllib.urlencode(dict([k, v.encode('utf-8') if isinstance(v, unicode) else v] for k, v in args.items()))
とした。
>>> urllib.urlencode(dict([k, v.encode('utf-8') if isinstance(v, unicode) else v] for k, v in args.items()))
'foo=bar&piyo=123&hoge=%E3%81%BB%E3%81%92'
面倒だな。