よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

October 25, 2007 [おもひで]

[Misc] JRuby

JRuby on RailsでRuby-GetTextを使いたい、と言う要望がちらほら、(というか一部からかなりしつこく?)くるようになった。今まで全然興味なかったから手もつけてみたことが無かったんだけど、とりあえずちょこっと触ってみることにした・・・・・ら、これなかなかのもんだね。

問題はso形式のライブラリが一切使えないこと(たぶん。おかげで、標準ライブラリの中からso系のものは根こそぎカットされてる・・・って、やり方あったら教えて!)。Ruby-GetTextではIconvとlocale_system.soが使えないのでその部分をJavaのライブラリでラップしてあげるようなコードを書く必要があると思われる。まぁRailsだけということだったらその辺をざっくりコメントアウトすれば動いちゃうんだろうけど(実際そういうパッチが送られてくるし・・・)、Ruby-GetTextはコンソールで動かしたときにローカライズされた文字列が文字化けせずに表示できる、というのがウリなんだから、どうせJRubyに対応させるんだったらそこまでやりたいよね。

ま、それはそれとして、jirbでちょっと実験。

% /usr/java/jruby/bin/jruby /usr/java/jruby/bin/jirb
irb(main):001:0> require 'java'
=> true
irb(main):002:0> locale = java.util.Locale.getDefault
=> #<Java::JavaUtil::Locale:0x1be2893 @java_object=ja_JP>
irb(main):003:0> locale.to_s
=> "ja_JP"

おぉ。簡単だ。ってかフツーにJavaでちょっとしたコードを確認したいとき、こんな感じで確認できちゃうってすげー便利かも。public static void main(String[] args)とか書かないで済むんだからなー(いつも忘れるんだよな、この文(^^;))。

[Misc] Pseudo Iconv for JRuby

とりあえず、Ruby-GetTextで使ってる文字列変換Iconv.convのJRubyでの実装はこんな感じかな。

require 'java'
 
module Iconv
  module_function
  def conv(to, from, str)
    str = java.lang.String.new(str.unpack("C*").to_java(:byte), from)
    str.getBytes(to).to_ary.pack("C*")
  end
end
 
if __FILE__ == $0
  puts  Iconv.conv("Shift_JIS", "UTF-8", "あいう")
end

とりあえず、動いたみたいだけど・・・。


編集