WSGIでの日本語を含むURLへのリクエストへの対応

おはようございます♪Azusaです。

最近、Apache2.4 + mod_wsgiでのCMS作成をコツコツとやているのですが、日本語を含むURLへのリクエストを受けた際のルーティングにてハマった点があったので備忘録として書いていきます。

問題点

日本語を含むURLがリクエストされた際に、environ[‘PATH_INFO’]にバイトコードで記載された文字列が格納される事です。

これの何が問題かというと、あくまでもバイトコードで記載された文字列型の変数なので、decode(‘utf-8’)も使えないので元の文字列に復元するときに面倒です。

また、webでのリクエストの際のURLエンコードとも形式が違うため、ルーティングにてマッチ処理を行う際に、そのままでは不可能であるということが問題でした。

解決策

こちらの記事に書かれているように、

byteStr = '\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86' # != b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'
utf8Str = bytes.fromhex(' '.join([ "%02X " % ord( x ) for x in byteStr ])).decode('utf-8')

とすれば、リクエストされた元の文字列に変換できました。

Python2系では文字列型にもdecode()関数が実装されていたようで、簡単に変換できたようなのですが、3になってからは削除されてしまったとのことで、残念ですね。

上記手順を踏めば、日本語のURL等でもキチンと処理できるようになるため、Blog等で記事のURLに日本語を含めていてアクセスできずに困っている方がいれば参考にしていただければと思います。

ではでは~♪

コメントを残す