3日悩んだ問題が解決!

どうも。Python お勉強中のぷりっけです。


Google App Engine の webapp の仕様がちょっと気に入らなかったので、
URLのディスパッチとコントローラー部分を自作していますが、
Cookie をハンドルするメソッド回りで文字化けが発生して困ってました。


Request/Response オブジェクトには、WebOb を使いました。
で、クッキーに保存する値は、urllib.quote で url エンコードします。

value = urllib.quote(value)
response.set_cookie(key, value)

で、読み出す時は、urllib.unquote でデコードします。

value = request.cookies.get(key)
value = urllib.unquote(value)


ところがこれだと日本語文字が文字化けするんですね。
全てを utf-8 に統一しているので問題は無いつもりなんですが、
色々やっても文字化けです。


散々悩んでようやく気付いたのが、request.cookies.get で取得した値が、
unicode オブジェクトになっているということ!
そして、urllib.unquote が unicode オブジェクトの入力を、
正しく処理できないらしいということでした。


urllib.unquote の挙動については、itasukeさんのこちらの記事で教えて頂きました。
例外が出ないので、なかなか気付けなかったみたいです(…言い訳でーす)。
itasukeさんの記事によると、UTF-8 のまま unicode にされてしまうとか…。
どうりで、文字化けしてしまうわけですね…。


で、WebOb の Request からの取得値を value.encode('raw_unicode_escape') して
str にしてみたところ、文字化けは解消されました。


これを受けて、クッキーをハンドルしているクラスに、次の作業メソッドを追加。

def __decode(self, value):
    if isinstance(value, unicode):
        value = value.encode('raw_unicode_escape')
    value = urllib.unquote(value)
    return value

もちろん、エンコード側も似たように作成。


…というわけで、なんしか解決♪


こんなことに3日も悩んだわけですが、
おかげさまで Python文字コード周りの見通しが良くなりました♪*1
これぞまさに、棚からぼた餅! …… (。´д`) ン?
…いや、ひょうたんからコマ…?
…いや…違うな…。
…ま、まあ、ええか〜♪ (*-∀-)ゞ




にほんブログ村 バイクブログ カワサキへ
★来ていただいて(人'▽`)ありがとう☆
バイクネタじゃないけど、よろしくね!♪

それにしても、Python、面白いです♪

*1:でも Python 3 ならもっと簡単だとかナンだとか…♪