成瀬です。

Kouya wrote:
> strscanのリファレンスマニュアルを書いています。
> 
> 添付したサンプルがruby 1.9 では動かないのですが、
> 1.9では何か変更する必要があるのでしょうか。
> よろしくお願いします。
> 
> 
> サンプル
> 
> require 'strscan'
> 
>       $KCODE = "e"
>       s = StringScanner.new("るびい") # 文字コードはEUC-JPとします
>       $KCODE = 'n'                    # 単なるバイト列として認識されます
> p      s.getch                         # => "\244"
> p      s.getch                         # => "\353"
>       $KCODE = "e"                    # EUC-JPの文字列として認識されます
> p      s.getch                         # => "び"
> p      s.getch                         # => "い"
> p      s.getch                         # => nil
> 
> 以下出力
> 
> ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin9.2.0]
> "\244"
> "\353"
> "び"
> "い"
> nil
> 
> ruby 1.9.0 (2008-10-05 revision 18293) [i386-darwin9.5.0]
> s1_euc.rb:5: invalid multibyte char (US-ASCII)
> s1_euc.rb:5: invalid multibyte char (US-ASCII)
> s1_euc.rb:5: syntax error, unexpected $end, expecting ')'
>       s = StringScanner.new("るびい") # 文字コードはEUC-JPとします

1.9 のテストありがとうございます。

まず、1.9 では $KCODE は廃止になっています。
なので、$KCODE は効果を持ちません。

次に、英数記号以外、ひらがなや漢字などをスクリプト内に書く場合は、
$KCODE でなく、magic comment を用います。
今回の invalid multibyte char というエラーは、
magic comment による指定がないため、スクリプトが、
US-ASCII で書かれているとみなされたために出ています。

この辺はるりまの多言語の所にあるのでご参照&わかりづらい部分を見つけたら
教えてください。
http://doc.loveruby.net/refm/api/view/spec/m17n

さて、encoding は $KCODE でなく、それぞれの String が持っています。
ある encoding の文字列を得る方法はいくつかあるのですが、
リテラルは "\u{308B 3073 304}" というように Unicode エスケープを用いて書き、
これを String#encode を用いて変換するのが楽かと思います。
utf8 = "\u{308B 3073 3044}"
eucjp = utf8.encode("EUC-JP")
sjis = utf8.encode("Shift_JIS")
という感じですね。

-- 
NARUSE, Yui  <naruse / airemix.jp>