はじめまして。加藤と申します。
jruby と cruby の挙動の違いについてご教示いただきたくメールします。
普段、仕事の関係もあり、jruby を Windows 上で使用しているのですが、ソー
スコードがUTF-8 の場合でコマンドプロンプトに日本語メッセージを表示しよう
とするとうまく行きません。(コマンドプロンプトのコードページを UTF-8 に変
更すると出力が崩れてしまいます。これは Windows 側の問題だと思います)
そこで、以下の記事を参考にして
http://d.hatena.ne.jp/wwwcfe/20101229/ruby19_encoding
標準出力の外部エンコーディングを Windows31J にしてやれば良いのでは、と考え
jruby -EWindows-31J:UTF-8 xxxx.rb
とやってみたのですが、jruby では、-E オプションをつけても標準出力の外部
エンコーディングが設定されないままで出力が化けてしまいます。
例として、上記記事のサンプルコード
# -*- encoding: utf-8 -*-
# 外部エンコーディング
p Encoding.default_external
p $stdout.external_encoding
# 内部エンコーディング
p Encoding.default_internal
p $stdout.internal_encoding
str = "こんにちは世界"
# 文字列のエンコーディング。ソースコードと同じになる。
p str.encoding
# 文字列を表示
puts str
を
> jruby -EWindows-31J:UTF-8 test.rb
で実行すると
#<Encoding:Windows-31J>
nil
#<Encoding:UTF-8>
nil
#<Encoding:UTF-8>
<文字化け>
といった風になります。
ちなみに、最新の ruby1.9.3-p286 の Windows インストーラを使用した場合、
特にオプションを設定しなくても、上記のサンプルコードの出力が、Windows-
31J に変換され、コマンドプロンプト上で化けません。(上記ブログ記事の時点
から動作が変更されているようです)
もちろん、jruby でもスクリプトの最初に
$stdout.set_encoding("Windows-31J","UTF-8")
とかつければ問題ないのですが、起動オプション側でなんとかできないかと思案
中です。
jruby は、1.7.0 です。よろしくお願いします。