IronRuby上のRSpecで日本語が文字化け

IronRuby 1.0.0.0 とRSpec 1.3.0の組み合わせでテスト記述にShift_JISを使うと文字化けします。
具体的には

describe Array, "emptyの場合" do
  before do
    @empty_array = []
  end

  it "emptyであること" do
    @empty_array.should be_empty
  end

  it "sizeが0であること" do
    @empty_array.size.should == 0
  end

  after do
    @empty_array = nil
  end
end

このような記述で実行すると

>spec array_spec.rb -fs

Array emptyツの場合

  • emptyツでつ�ツるこツづ
  • sizeツつェ0ツでつ�ツるこツづ

Finished in 0.074 seconds

2 examples, 0 failures

この様に怪しい文字化けが起こりました。
オプションを-fhtmlにして出力したHTMLファイルでも同様の文字化けが発生します。
かなりがっかりしていたのですがテスト記述ファイル文字コードUTF-8にすると文字化けが起こらないことがわかりました。
極めて怪しい不具合で気になりますがとりあえずは文字コードUTF-8を使用する運用で使えなくはなさそうです。
コンソールやテキストファイルなどでShift_JISの方が都合がよいという場合にはnkfなどを使えば良いと思います。
例えば文字コードShift_JISで保存されている上記のテスト記述の場合にnkfを使って

>nkf "-SwO" array_spec.rb array_utf8_spec.rb & spec array_utf8_spec.rb -fs | nkf "-Ws" & del array_utf8_spec.rb

Array emptyの場合

  • emptyであること
  • sizeが0であること

Finished in 0.073 seconds

2 examples, 0 failures

このようにして文字化けさせずにコンソールに表示させることができます。
上記は対比のために実行コマンドを強引に一行で書きましたが以下の様な3つのステップで実行しています。
1.Shift_JISのarray_spec.rbファイルをUTF-8のarray_utf8_spec.rbに変換

> nkf "-SwO" array_spec.rb array_utf8_spec.rb

2.UTF-8のarray_utf8_spec.rbを使用してRSpecテストを実行してその出力をShift_JISに変換して表示

> spec array_utf8_spec.rb -fs | nkf "-Ws"

3.実行のために作成したUTF-8のarray_utf8_spec.rbを削除

> del array_utf8_spec.rb

この様な処理を行うバッチファイルを作成すると良いでしょう。(時間があればサンプルを書いて公開したいと思います)
なおwindows版のnkfは「nkf.exe nkf32.dll Windows用の詳細情報 : Vector ソフトを探す!」からダウンロードできます。


RSpecが使えなければIronRubyに失望するところでしたが、なんとかRSpecが使えそうなこととやはりRubyと.NETで相互運用ができるのは私にとっては大きな魅力でありかろうじて絶望はまぬがれました。
実は他にも

  • NKFモジュールの各メソッドが未実装
  • IO#readpartialが未実装
  • Integer(nil)でエラー発生

などの点で問題にぶつかっています。
これらは言語的な問題ではありませんが、例えば

などの互換性で問題になっています。
この様な状況から感じることはIronRubyはまだ当面は.NETのライブラリを中心に使うような用途向きで、Rubyのライブラリやリソースを駆使する場合には注意が必要だということだと思います。
なおこれらの問題についてもある程度調査と対処ができていますのでまたの別の機会にでも報告したいと思います。