2007/12/31

JRubyと日本語 解析(2)

とりあえず、JRubyではUTF8でソース書いて使うのが良いみたい。正規表現は/ほげ/uのようにuオプションを使えばヒットする。ここ参照

JRubyの内部はRubyStringというクラスで文字列を持っているっぽい。これはByte列で文字列をもっている。Kernel#openとかでファイルを開いたときは、Shift_JIS(Windows-31J)のファイルならばShift_JIS(Windows-31J)のバイト列で保持するし、InputStreamReaderでエンコードを指定して読み込んだとかJavaのAPI経由ならUTF-8で持っているみたい?

SJISを読んでEUCを出力するときは、Openの場合はSJISから

open(ARGV[0]).each do |line| puts NKF.nkf('-eS', line) end

InputStreamReaderの場合はUTF-8から

def open_with_encoding(path, encode, &block) reader = nil begin reader = java.io.BufferedReader.new( java.io.InputStreamReader.new( java.io.FileInputStream.new(ARGV[0]), encode)) line = nil while (line = reader.readLine()) != nil block.call(line) end ensure reader.close unless reader == nil end end open_with_encoding(ARGV[0], 'Windows-31J') do |line| puts NKF.nkf('-eW', line) end

JRubyのNKFはEUCを指定したときマルイチとか丸付き文字が入っていると、例外を吐いて落ちるみたい。これは内部で使用しているCharsetEncoderでWindows-31Jの丸付き数字をEUCにマッピングできないため、CharacterCodingExceptionをスローしてしまい、invalid encodingと怒られる。丸付き数字をEUCに変換は今のところあきらめるしかないようだ。

そもそもEUC-JPには丸付き文字(NEC拡張)が存在せず、Windowsで扱えるのは(Shift_JISに対するWindows-31Jみたいな)NEC拡張を含むEUC-JPを使っているからだそうで、Javaでは1.5からEUC_JP_Solarisというのを指定すれば使えるようだ。(JRubyのNKFは普通のEUC-JPを指定しているのでこれを試しに書き換えてみた。)ただしこれを使うと「~」がうまく扱えなくなった。参考

0 件のコメント: