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 っぽい何かなはずなのになぁ。
面倒臭い。
でも考えてみたら、タイプライブラリが投げる例外が、どんなエンコーディングの文字列をくれるのか事前に知ることはできないのかも。