Ruby1.9.1でエンコード勉強中

よくわからない。
こんなコードを書く。

#encoding : SJIS
"".encode("ASCII-8BIT")

実行すると、
こんなエラーが出る。

D:/temp/ruby19test.rb:2:in `encode': "\xE3\x81\x82" from UTF-8 to ASCII-8BIT in conversion from Shift_JIS to ASCII-8BIT (Encoding::UndefinedConversionError)
from D:/temp/ruby19test.rb:2:in `

'

ASCII-8BITってASCII部分だけ互換があって、それ以外はなんでもいいってモノじゃないのか・・・?
あ、encodeはエンコード変換だから、ASCIIの範囲外の文字列を含むとASCII-8BITに変換はできないってことか。
んでもなんでここでUTF-8が出てくるのかはわからん。


どうしてこんなことをしているのかというと、DXRubyスターターキットのdevelopment.exeを動かすとこんなエラーが出るからなのだ。

:3:in `require': incompatible character encodings: Windows-31J
and ASCII-8BIT (Encoding::CompatibilityError)
from :3:in `block in '
from :1:in `each'
from :1:in `'

game.exeのほうはちゃんと動く。
この2つに違いがあるとすれば、ruby.exeを使うかrubyw.exeを使うかぐらいではないかと思う。
っつーのは、miniprelude.cで実行されてるコードの名前で、これはRuby.cから呼ばれている。
Ruby1.9.1本体で、gemに関連して実行されるもののようだ。
上で試したことを前提とすると、US-ASCII or ASCII範囲内のみのASCII互換文字列じゃなければ、ASCII-8BITに変換しようとするのは間違っているということになる。
しかしコードにもディレクトリ名にも、ASCII範囲内のコードしか使ってない。
結局のところ、なんでこんなエラーになるのかはよくわからない。


Ruby1.9.1のエンコード周りは難しい。
初心者が使い始めるときに結構な割合でハマって、難しいと感じるんじゃないかと思う。
特に、いまはまだ本にせよWebにせよRuby1.8系のコードが多いから、Ruby1.9.1で動かしてみたらエラーになる、ということが多そうだ。
初心者をターゲットにするDXRubyであり、スターターキットであるわけで、変なところでハマってもらうのはあまり嬉しくない。
Ruby1.9.1ベースにするかどうかは悩みどころだ。