書くことないです。

ayamadoriが独り言を呟く日記。

こんなこともやってます。(が、もはやあまりやる気は無かったりする)

【Nothing to release./携帯電話向けSoftware】

PyS60で日本語と仲良くする方法

702NKから705NKに変えて、一番不便になったのは、まともなファイラがないことだった。
デフォルトのファイラは見える範囲少ないし、勝手にフォルダ作るし。かといってSignedなファイラなんてそうあるわけもなく。
で、いろいろ探してみたところ、S60 FanさんのところでpyFileMngrという、pythonで書かれたファイラが紹介されていた。pythonならある程度705NK上でも動くし、ファイラとしてもそこそこ使えるっぽい。
というわけで、入れてみると、確かにそこそこ使えるんだけど*1、日本語ファイルを無視してしまうのが困る。
で、pythonリファレンスを斜め読みがてら、調べて見ました。

どうも、S60 Fanさんによると、日本語版S60のデフォルト内部エンコードUTF-8らしい。
で、ここいらに答えらしきものが載っていた。
pythonはデフォルト内部エンコードをasciiに設定してあるようだ。これは、コンソールで

import sys
sys.getdefaultencoding()

と入力すれば確認できる。とすれば、これをUTF-8に変えれば、特にアプリ側に変更を加えることなく日本語表示が可能になるはずだ。
そのためには、パソコン版Pythonなら以下の/usr/lib/python2.4/site-package/sitecustomize.pyを作成する流れになるのだが、

import sys
sys.setdefaultencoding('utf-8')

PyS60におけるsite.pyはソースを読む限り、パソコン版のような処理*2を行っていない。つまり、パソコン版でいうsyte.pyの読み込みを抑制した状態であり、どこでもsys.setdefaultencoding(encode)が呼べると思われる。
というわけで、コンソールで

import sys
sys.setdefaultencoding('utf-8')
print "日本語"

と入れると、ちゃんと"日本語"と表示される。
つまり、各アプリのdefault.py*3の中の、
import sys
の直後に
sys.setdefaultencoding('utf-8')
の1行を追加してやると、アプリでも日本語が表示できるはずだ。
実際、pyFileMngrS60で試したところ、日本語ファイルの表示、日本語フォルダの作成等、ちゃんとできた*4
実際には、アプリによらずデフォルト内部エンコードはその環境に合わせたものであるべきで、かつ変化しないものだから、pythonシェル自体のdefault.pyで
sys.setdefaultencoding('utf-8')
を呼び出すのが理想的かもしれない。このファイルはいじるのが面倒なので、てすりさんの日記のように、いったんdefault.pyを外出しして、そこでsys.setdefaultencoding('utf-8')を設定するのがいいかも。
が、この方法で果たしてスタンドアロンpythonアプリでも、同様にデフォルトエンコードUTF-8に変わってくれるか分からない。アプリ制限のないS60 3rd端末をお使いの方、よろしければ試してみてください。
つか、今時デフォルトがasciiってのはないんじゃね?と思わないでもない。
アプリを作る側としては、環境によって異なる内部エンコードにいちいち決め打ちで対応する*5のは面倒だから、とくに指定したいときを除いてはデフォルトエンコードに任せるほうがいいのかな。

長くなった割に内容がないぞ(;´∀`)ど素人が適当に書いてるんで、間違ってたらどなたか訂正をお願いしますm(__)m

*1:最初、下位ディレクトリに行くのに右キーを押すのを知らず、決定キーを押し続け、動かないなーと悩んでたのは内緒^^;

*2:sitecustomize.pyを読み込んだ後、sys.setdefaultencoding関数を削除する

*3:PyS60における、各アプリの起動用スクリプト

*4:ファイル検索は日本語が通らない。これは正規表現モジュールであるreが標準で日本語に対応していないせいだと思う(2007/10/11)日本語でのファイル検索もできてる。検索文字列の書き方が悪かっただけ?

*5:例えばunicode("日本語のユニコード文字列", "japanese.euc_jp")って感じ