WIN32OLE の例外は ASCII-8BIT

本格的に Ruby 1.9.1 に移行してみようと、仕事で使ってるユニットテストを動かしてみた。

エンコード絡みのエラーが頻発。

Encoding::CompatibilityError: incompatible character encodings: 
Windows-31J and ASCII-8BIT

もちろんスクリプトは CP932 で書いてある。

コードを見てみると、こんな感じだった。

e = assert_raise(WIN32OLERuntimeError) do
    # WIN32OLE の例外を発生させるテスト
end
assert_match(/指定されたパスが見つかりません/, e.to_s)  # ここでエラー

shebang*1に -ECP932:CP932 とか付けてみたけどムリっぽい。

もちろん String#force_encoding*2 すれば通る。

assert_match(/指定されたパスが見つかりません/, 
             e.to_s.force_encoding("CP932"))

String#encode*3 した訳じゃないので WIN32OLERuntimeError の持ってるバイト列は Windows-31J っぽい何かなはずなのになぁ。

面倒臭い。

でも考えてみたら、タイプライブラリが投げる例外が、どんなエンコーディングの文字列をくれるのか事前に知ることはできないのかも。

*1:今まで shbang だと思ってた。she って何?

*2:文字列の持つエンコーディング情報を指定された encoding に変更する。

*3:指定したエンコーディングに変換した文字列を返す。