成瀬です。 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>