木村です。

大田黒俊夫 さんは書きました:
> Ruby 1.9 系列のエンコーディングについて質問します.
> 
> 以下のようなスクリプトで全角ダッシュ"−"をエンコードしようとすると,
> エラーではねられます.
> 
> ちなみに環境は Windows-XP SP3, Ruby 1.9.1 p243 (i386-mswin32)です.
> 
> # -*- coding: Shift_JIS -*-
> #
> p "ー".encode("Windows-31J")  #=> "ー"
> p "ソ".encode("Windows-31J")  #=> "ソ"
> p "−".encode("Windows-31J")  #=>Encoding::UndefinedConversionError
> 
> エラーメッセージの中に
>  "\xE2\x88\x92" from UTF-8 to Windows-31J in conversion from Shift_JIS
> to Windows-31J
> というメッセージが含まれています.
> 
> Shift_JIS の 5c というコードが悪さをしているのでしょうか?
> そもそも,Shift_JIS と Windows-31J がどう違うのか,よくわかっていません.

今回のこの件については、0x5cは関係ありません。
ShiftJISとWindows-31Jというのは、ほぼ同一のものなのですが一部に違いがあ
ります。
そのため、両者を混用すると今回のようなことが発生します。

上記の例の全角ダッシュは、ShiftJISとWindows-31Jでは値が違います。
「ShiftJISで表現した全角ダッシュをWindows-31Jの振りして」変換させ
ようとしたので、エラーになったわけです。

#大分はしょりましたが、ほかの人が補足してくれるんじゃないかな

Ruby Freaks Lounge:第4回 Ruby M17N 事始め:文字コード編|gihyo.jp … 技
術評論社
http://gihyo.jp/dev/serial/01/ruby/0004

Windows-31JとShiftJISがどうちがうのかは上の記事辺りをとっかかりに
調べてみてください。

> 
> ちなみに,上記スクリプトの magic comment で Windows-31J を指定するとこのエラーは起きません.
> 
> ご教示いただければ幸いです.
> 

マジックコメントを Windows-31J にしたことによって、ShiftJISとの
混用がなくなったのでエラーも起きなくなったというわけです。


-- 
木村浩一/KIMURA Koichi
 I thought what I'd do was, I'd pretend I was one of those deaf-mutes or
shoud I?
 mail kbk at kt.rim.or.jp
 web  www.kt.rim.or.jp/~kbk/zakkicho/index.html