2007-05-17 (Thu) [長年日記]

NKF moduleを実装

JRubyのNKF moduleは、定数だけを定義したダミーのビルトインモジュールが含まれていて、本来 あるべきモジュールメソッドがひとつも呼び出せなかった。

そこでビルトインモジュールは削除して捨ててしまい、NKF module相当を動くように実装してみた。 しかし今更Pure JavaでNKFを再実装するのも不毛チックにも思われたので、 今回はkconvがそこそこ満足に動く範囲にとどめて実装している。

無事に取り込まれ*1、先ごろ出たJRuby 1.0.0RC2には含まれている模様*2

  • guessで自動判別できるエンコーディングはiso-2022-jp/Shift_JIS/EUC-JPの三つ。x-JISAutoDetectを使うため。
  • 特に指定が無いときは入力エンコーディングを自動判別(x-JISAutoDetect)する。
  • $KCODEが指定されていたら、$KCODEで指定されたエンコードが入力されることを期待する。(これはMRIと仕様が違ってくるので変えるかも)
  • Shift_JISはWindows-31J(cp932)が指定されたものとして振舞う。

ただし今のNKFではMIME encode/decodeをまったくサポートしていないので、 いずれ追加しようと思ってる。単純に作るとJavaMail APIを使うのが楽チンだが、 mail.jarの追加が可能か交渉しないといけないな。

ということで今度のJRubyではnkf呼び出しを削除するパッチを当てなくても、 Praggerが動くんじゃなかろうか。動くといいな...

実は二番目の問題のほうが根が深くてinstance_evalへの第2引数に 文字列以外のオブジェクトを渡したときに発生するJRubyのバグでした。

以下のIssueでパッチ&報告済み。

  • [JRUBY-942]: ClassCastException occurs when Object#instance_eval is invoked

こちらは1.0.0RC2には間に合わなかったみたいだが、次のリリースあたりでは直るんじゃないかな。試したいときは上記パッチをtrunkに当ててください。

Tags: JRuby

*1 なにも考えないでJava5ステートメントやGenerics使って書いたらJava 1.4で書き直すハメになったけど;-)

*2 リリースノートは出てないけどひっそりとファイルが置かれてます