前回、IronRuby の日本語処理で泣きたくなる状況という事を書きました。せっかくなのでこれについて、少しメモ程度に残しておこうと思う。
問題になったケースは以下のコード。
p Dir.glob('/test2/*')
p Dir.glob('/test/*')
カレントドライブのtestとtest2フォルダのファイル,フォルダ名の一覧を取得するスクリプトを実行した。ちなみにフォルダは以下のようになっている。
Testフォルダの下には日本語ファイルというフォルダがある。また、Test2の下にはABCというフォルダがある。
これを次の処理系で実行してみた。
- ruby 1.8.7
- ruby 1.9.1
- IronRuby 0.9.1
実行結果は以下の通りとなった。
それぞれについて考えてみる。
- Ruby 1.8.7 -K なし
Test2 フォルダ配下のフォルダはASCIIであるためそのまま出力されている。
Testフォルダ配下は日本語ファイルである。 p で結果を出力している為、ruby 処理系が文字列(Stringクラス)の中内容をRuby処理系に指示しているエンコーディングで成形して出力する。この時、文字列内にはOSから返却された ファイル名はShiftJIS(CP932) のキャラクタセットで入っており、さらに-Kを指定していない為、Ruby処理系は日本語文字列を表示せず、"\xxx" という表記で出力する。 - Ruby 1.8.7 -Ks 付き
-Ksをつけ ShiftJIS と指定している。そのため Ruby 処理系は OSから返却された日本語ファイル名を表示する。 - Ruby 1.9.1
Ruby 1.9 では -Ks を付けなくても、各文字列オブジェクトにエンコーディング情報を持つため、OSから返却された文字が CP932 (shiftjisっぽい) と知っているため、各文字列にはその情報が付与されている。よって、そのまま表示されている - IronRuby 0.9.1
これが、問題。なんと例外が発生している。なお、 IronRuby のサイトには以下記述があるため、現在の 0.9.1 ではこの動作が期待できないと理解する。
MutableString basic operations - $KCODE and encodings are TODO
詳しくは、また別の機会に書こうと思う。
Roadmap の IronRuby.Libraries.dll より引用
結論(?)
IronRuby 0.9.1 段階では、まだ OSが日本語文字列を返却するとまともに動作しない。




コメントする