2007/12/31

JRubyと日本語 解析(1)

JRubyの日本語処理についてソースを見てみる。対象はJRuby1.0.3

org.jruby.Mainから始まり、コマンドライン解析を行うorg.jruby.util.CommandLineParserでは-Kオプションが存在する。(Usageには存在しないオプションもいくつか存在するようだ。)

次にorg.jruby.Mainのインタープリター実行処理であるrunInterpreterメソッドでCommandlineParser#getScriptSourceでソースファイル(.rb)を読み出すReaderを設定する。このメソッドで、コマンドラインオプションで設定したorg.jruby.util.KCodeを使わずに、KCode.NONEというKCodeオブジェクト強制的に使用している。

そこに以下のようなコメントがある。

// KCode.NONE is used because KCODE does not affect parse in Ruby 1.8

Ruby1.8ではStringの内部として文字列をバイト列で保持するため、問題ないように思われるが、このKCode.NONEを使用した場合、ソースをiso-8859-1で解析するため、ShiftJISのソースを読ませたときに「十」のような2バイト目が\になるような文字が含まれていると正しくソースを解析できずにエラーになる。

ということで、CommandlineParser#getScriptSource()のハードコード部分を、設定されているKCodeオブジェクトを使用するように変更。また、java.util.KCodeのdecoderとencoderメソッドでUTF-8とそれ以外しか判定がない部分にSJISとEUCの処理を追加する。

とりあえずこれで、JRubyをビルドして以下のスクリプトを実行してみた。

puts "あ" puts "十"

jruby -Ks sjis.rb B ^

エラーにはならなくなったが文字が壊れた。RubyStringにするときにおかしいのか、Yaccの処理が2バイト文字を扱えないのか。とりあえずだめだということがわかった。

0 件のコメント: