標準出力のエンコーディングの設定について

119 views
Skip to first unread message

Takashi Kato

unread,
Oct 28, 2012, 1:39:11 PM10/28/12
to jruby-u...@googlegroups.com
はじめまして。加藤と申します。
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 です。よろしくお願いします。

ytakagi

unread,
Oct 28, 2012, 10:21:11 PM10/28/12
to jruby-u...@googlegroups.com
私も、エンコーディングを起動オプションでなんとか出来ないか、
いろいろあがいてみましたが、いろいろやって諦めて、
フォルダ内のすべての .rb ファイルの1行目がどうなっているか
読み取り、それに応じて最初に行を付け加えたりするスクリプトを
自作しました。
(私はlinux 使っているので、問題はそちらとは別のことですが)

ほかの方は、どうしてるんでしょうかね?
謎です。

個人的には、エンコーディングの仕組みは複雑すぎて、
こんなものはとっとと止めてしまうべきだと思います。
--

ytakagi

PCメール・アドレス yta...@m5.dion.ne.jp

Reply all
Reply to author
Forward
0 new messages