URLエンコードを使ってユニコード文字列をCookieにセットする

久しぶりにHTTP Cookieなど使ってみたら、さっぱりノウハウが消えてしまっていて思わぬ苦戦をしました。理由はいろいろあるけれど、日本語など非ASCII文字列をCookieに設定する場合、URLエンコードしないといけないなど、もろもろの仕様をすっかり忘れていたことや、よくよく考えたらPythonで書いてきたCGICookieにはSession IDを設定するだけで、フィールドに入る文字列などはSessionに記憶させてたから、URLエンコードする必要がなかったというのも大きかった。けれど、一番の問題は、IDLEで試してもうまくいかない、urllibでもurllib2でもいいんだけど、quoteでエンコードして、unquoteで戻した文字列が、おかしくなってしまうというところであったでしょう。

ああ、最初からprint()デバッグでやりゃあよかった。

ネットで調べても、あまり情報が出てきませんでした。なのでここに記録しておこうと思います。自分も含め、誰かの助けになればと思います。

import Cookie
import urllib2

cookie = Cookie.SimpleCookie()
value = u'スパム'

# 記録
cookie['value'] = urllib2.quote(value.encode(u'utf-8'))

# 読み出し
if cookie.has_key('value'):
    value = urllib2.unquote(cookie['value'].value)
    value = value.decode(u'utf-8')