Unicode で萎えそうになったとき(orz)に思い出してほしい5つのこと




通常の CGI では環境変数 LANG や sitecustomize.py なんかで
なんとなくごまかせていた UnicodeUTF-8等 の使い分けも
Google App Engine ではキチンと処理してあげないとエラーになっちゃいます。


コーディング中に下のメッセージが出て、萎えた方も多いんじゃないでしょうかorz。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 33: ordinal not in range(128)

ボクもこいつにかなり体力と集中力を消耗させられました。
開発環境のdev_appserver.pyではエラーにならなくっても、Google App Engine にアップロードした後に実行するとエラーになったりすることもあるんですよねー。


以下はボクが試行錯誤の中で見つけたことです。
Unicode 関係でモヤモヤしたら思い出してください。

  • UnicodeUTF-8 はまったくの別物であることを認識しよう。
  • Python プログラム内部で使うときは Unicode で統一しよう。
  • プログラムから外部に書き出すときは UTF-8 に変換しよう。
  • self.request.get()で得られるデータの文字コードUnicode だよ。
  • urlfetch.fetch()で得られるデータの文字コードは、不定だよ。

UnicodeUTF-8 はまったくの別物であることを認識する。

一般的にこの二つが同一のように扱われていたり、プログラミング言語の中でうまいこと処理していたりしてくれている事実はあると思いますが、Python でこの2つは全くの別物と理解しておいた方が幸せになれます。

こちらのページが大変参考になります。
http://lab.hde.co.jp/2008/08/pythonunicodeencodeerror.html

Python プログラム内部で使うときは Unicode で統一しよう!

UTF-8等で統一するという手もありますが、Unicode の方が文字数を数えるとかいろいろできることがあるので、プログラム内部では Unicode に統一した方がいいでしょう。

プログラムから外部に書き出すときは UTF-8 に変換しよう

Unicode はプログラム内部だけで使われる仮想的な文字コードなので、HTML 等に書き出すときは実際の文字コードに変化する必要があります。

self.response.out.write( hoge.encode('utf-8') )

self.request.get()で得られるデータの文字コードUnicode である。

urlfetch.fetch()で得られるデータの文字コードは、不定

得られるデータによって文字コードが変わります。なので Unicodeに変換して使いましょう。

unicode( hoge, 'utf-8' )

ではでは