2007/12/19

JRubyと日本語

JRubyでどうも日本語の処理がうまくないなぁということでちょっと調べてみた。

環境はXP Proに以下

C:\test>ruby -v ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] C:\test>jruby -v ruby 1.8.5 (2007-12-15 rev 5200) [x86-jruby1.0.3]

(1)スクリプトに日本語を直接書いたとき(Shift_JISで保存)。

puts "こんにちは、JRuby!" puts "①" puts '十' puts "~"

Rubyは-Ksオプションをつければ動くけど、JRubyはエラーになる。

:1: sjis.rb:3: Invalid char `\201' in expression (SyntaxError)

「十」の2バイト目が\と同じになるというむかーし昔のCGIでよくでた文字化けと同じ。 puts '十\'で回避可能。
ちなみにJRubyには-Kオプションがない。

(2)ファイル入出力

こんにちは、JRuby! ① 表 ~

っていう内容のファイルをSJIS、EUC、UTF8で保存して

require 'kconv' require 'nkf' open(ARGV[0]).each do |line| puts line.tosjis puts NKF.nkf('-s', line) end

で読み込んで吐かせるだけ。

rubyはちゃんと動くんだけどJRubyだと。

C:\test>jruby output.rb euc.txt Kconv :こんにちは、JRuby! nkf :こんにちは、JRuby! Kconv :ュ。 nkf :ュ。 Kconv :ノス nkf :ノス Kconv :。チ nkf :。チ

C:\test>jruby output.rb utf8.rb Kconv :puts "縺薙s縺ォ縺。縺ッ縲゛Ruby!" nkf :puts "縺薙s縺ォ縺。縺ッ縲゛Ruby!" C:/tools/dev/jruby-1.0.3/lib/ruby/1.8/kconv.rb:207:in `tosjis': invalid encoding (ArgumentError) from :1 from :1:in `each' from :1

ばけらった。
どうもopen(file)のところでプラットフォームのデフォルトエンコードで読んだ文字列がByte列でもっていないようでNKFとかKConvできてない気がする。

(3)正規表現 Rubyだと日本語一文字ずつ扱うのに$KCODE='sjis'とかして "日本語".split(//)みたいなイディオムがあるらしいんだけど JRubyだとうまくいかなかったり、日本語を使った正規表現が マッチしなかったり。

$KCODE='SJIS' require 'nkf' open(ARGV[0]).each do |line| i=0 line.split(//).each do |c| puts "#{i}:#{c}" i += 1 end end

rubyは動くけどJRubyはエラー。これもlineに一行取った時点で文字列が壊れる。

ついでに1行野郎のテスト。

C:\test\kcode>ruby -e "open(ARGV[1]).grep(/#{ARGV[0]}/) {|s| puts s }" あ sjis.txt あいう①~十abc123

C:\test\kcode>jruby -e "open(ARGV[1]).grep(/#{ARGV[0]}/) {|s| puts s }" あ sjis.txt 's' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。

おや?JRubyの起動バッチの仕組みがいけてないっぽいなぁ。

教えて、Rubyの日本語の扱いに詳しい人。

0 件のコメント: