トップ 最新

kumaryu日記

2010-04-12

_ 日記

のどいたくてだらだらしてた。

最近日記じゃなくなってきたんじゃね?まあいいか。いいのかよ。

近々サーバ移転します。URLは変わらないので特に何ら問題無いと思うんですが、もしかしたら一時的につながらなくなったり正常に表示されないかもしんない。今月中にはやるつもり。

情報処理技術者試験、エンベデッドの問題集は買えた。そもそも3種類くらいしか出てないらしい…。幸いそのうち1つが過去問集+その解説という求めていたものだったので助かった。まだ勉強してないけどな。やべー!!

_ [Ruby] IronRubyとSilverlightでは日本語がまともにつかえない件

まだまだあるよ、IronRubyのはまりどころ!

まじかー。まだ嵌めるのかー。

Data Bindingが使えないのは諦めたんで、せこせこと普通にGUIに値を設定してたんですよ。Data Binding無くても従来のWindows.Formsみたいな作りになるだけなので死ぬ程めんどいとかはないですな。コードがすっきりせずにとても悲しいですが。

リストボックスに日本語つっこんでみたら文字化けしやがるんですよ。おやおや。文字列UTF-8なんだけどな。日本語じゃなければ化けてないんだけどな。

ソースを見ていたらIronRubyはRuby1.9のように文字列毎に自分の文字エンコーディングを持っている模様。さらに見ていったらKcodeがどうこうというのを見付けたので$KCODEを思い出した。

じゃあ$KCODE設定しよう。したら。'KCODE (UTF-8)'なんて文字コードは知らねーよ!という例外が。なにそれ、俺も知らないんですけど…。

詳しく見ていったら少なくともSilverlight版のIronRubyではKCODEの設定とかその辺がバグりまくってて設定できないのが分かった。

仕方ないがソースがあってくれるので、自分でなんとか通りそうなところまで書き換えて動かした。

が、しかし、文字化け…!

で、ですよねー。

今設定しようとしてる文字列はソース埋め込みの日本語文字列。IronRubyは1.9と同じように文字列毎に文字エンコーディングを保持する。つまりソースをパースする時点でリテラル文字列の文字エンコーディングは決定してるわけで、あとから$KCODE指定しても意味ないよと。おっしゃる通りです。

じゃあ文字列の保持してる文字エンコーディングを変更してやればいいんじゃね?Rubyレベルで出来るもんならな!ということでRubyレベルではそれを変更する術は今のところ無い模様。つかエンコーディングの取得すらできないんですけどー*1

Iconv*2があるのでこれでutf-8からutf-8に変換してみるものの、やっぱり文字化け。エンコーディングについてはちゃんと扱ってないようだ。しょぼん。

やっぱりソースをパースする時点で文字エンコーディングを指定するのが一番まとも。-Kuオプションをつけて起動すりゃいいんですよね。…どうやって?

IronRubyのrubyコマンド相当であるir.exeにはちゃんと-Kuを渡せるんだけど、Silverlightでそれ相当のことはどうすりゃいいのよ。

ソースを辿りまくってみたけど、エントリポイントであるMicrosoft.Scripting.Silverlightには言語オプションを設定する機能が無く不可能っぽい。不可能っぽい。

…仕方ないなぁ。IronRubyのエンジンの方をいじって、オプション省略時は-Ku相当になるようにデフォルト値を書き換えちゃおう!

ということをやって、なんとか日本語表示ができました。めでたしめでたし。

しかしMicrosoft.Scripting.SilverlightでIronRubyというか言語の起動オプションを指定できないのはちょっと厳しい。IronRubyにはKCODEオプションの他にも互換モードみたいなのがあって、1.8モードとか1.9モードとかをオプションで指定できる。1.9モードじゃないと一部のメソッドが使えなかったりするようだ。1.9モードは魅かれるなぁ。

まあMicrosoft.Scripting.Silverlightを使わなければいいんだけどね。Chiron使うのやめて、C#でSilverlightのアプリケーション作って、そこから自分でIronRubyのエンジンを作成して呼び出せばいいはず。この場合はちゃんとオプション渡せるし。俺もそうしようかな。

今回のパッチというか変更点はあとでここに貼っておきます。起動オプション渡せないのはIronRubyじゃないからともかく、KCODE指定で100%エラーなのは報告せんとなぁ。

予想できることではあったけど、IronRubyも文字エンコーディング辺りは現状ではかなり厳しい。とりあえずutf-8モードで起動さえできればあとはなんとか出来なくもないが。

ちなみにSilverlight版では-Ksとか-Ke相当のは使えないです。UTF-8のみ。他は削られてるので。

*1  1.9モードにすればString#encodingで取得できるよ

*2  中身はもちろんiconvじゃないけどさ