Hatena::ブログ(Diary)

Solr, Python, MacBook Air in Shinagawa Seaside RSSフィード

2008-12-09

[][] 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 でこの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' )


ではでは

勘違いしてるのでは?勘違いしてるのでは? 2008/12/09 17:52 >self.request.get()で得られるデータの文字コードは Unicode だよ。

self.request.get()で得られるデータは文字列オブジェクトではなくUnicodeオブジェクトだよ。内部形式はUCS-2またはUCS-4だよ。
http://dsas.blog.klab.org/archives/51322951.html

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/knaka20blue/20081209/1228794799
リンク元