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 件のコメント:
コメントを投稿