JRubyのエンコードでつまづいた件

JRubyをやっていて文字コードの扱いがCRubyと異なるんです。
サンプルを載せてみました。

以下のバージョンで試しています。
Ruby 1.9.3p194
JRuby1.7.0.RC2

JRubyとCRubyでのエンコード扱いの違い

# coding: utf-8

puts DATA.read.encoding

__END__
日本語です。

これを実行すると、CRubyとJRubyで結果が異なります。
Windows上で実行すると、
CRuby : "UTF-8"
JRuby : "WINDOWS-31J"

JRubyの場合、どうやらプラットフォームのエンコードに依存してしまうみたいです。
これは、Javaエンコードがプラットフォーム依存で、Javaとの相互互換のためにこのような仕様になっていると思われます。(たぶん。。)
"UTF-8"のデータを扱っているんであれば、DATAも素直に"UTF-8"を返して欲しいものですが。。。
これは、正直厄介です。

JRubyは、Fileクラスがプラットフォーム依存の文字コードを返すっぽい?です。

解決方法

# encode: utf-8
JRubyはこの指定ではダメで、引数"-E <エンコード>"で渡します。

% jruby -E utf-8 <File>

アプリ作るなら、統一した文字コードで作っていくことが必要そうです。
とりあえず、Windows実行ならファイルをutf-8にした上で"-E utf-8"をつけるようにすれば当分の問題は解決できそうです。


追記、
上記でダメならば、以下で解決できるかもしれません。
少なくとも、Redmine on JRuby on Windowsでの文字コード問題は解決できました。

% jruby -J-Dfile.encoding=utf-8 ...