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"を返して欲しいものですが。。。
これは、正直厄介です。
解決方法
# 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 ...