プロが教えるわが家の防犯対策術!

Rubyを勉強を始めようと思いまして、Active Script Ruby1.8.22をインストールし、irb(Interactive RuBy)を使って簡単な機能の勉強をしていました。

その際、ある特定の場合、日本語が文字化けしてしまう。という分からないことが出てきましたので質問させて頂きます。

一つ目は、
printやputsなどで日本語を表示させようとする場合、

print("")
print("あいうえお")

のように、print("") と入力後、カーソルを移動させ "" の中に あいうえお を入れた後エンターすると以下のように
print("あいうえお")と表示されるところが文字化けしてしまうということです。しかし、それを実行すると、しっかりと あいうえお と表示されます。

irb(main):031:0> print(" 「 、 ヲ ィ")
あいうえお=> nil


これを文字順通りに、

print("
print("あいうえお
print("あいうえお")

のように、print("  の後に、あいうえお を入力。その後括弧閉じすると以下のようにしっかりと、print("あいうえお")と表示されます。

irb(main):032:0> print("あいうえお")
あいうえお=> nil


どちらの実行結果も変わらず、しっかりと あいうえお と表示されるのですが、やはり命令入力の段階での文字化けが気になります。


二つ目は、
配列の文字化けです。
waza = ["殴る", "蹴る", "強く殴る", "強く蹴る"]といれてエンターすると、以下のように配列の中の日本語が文字化けします。
(また、これも当然一つ目のprintやputsのように、
waza = ["殴る", "蹴る", "強く殴る", "強く蹴る"]
を書く際に先に
waza = ["", "", "", ""]
と書いた後、カーソル移動で日本語入力すると、命令の部分も文字化けします。以下に載せているのは、命令部分が文字化けしないように左から順に書いていったものです。)


irb(main):022:0* waza = ["殴る", "蹴る", "強く殴る", "強く蹴る"]
=> ["\211\243\202\351", "\217R\202\351", "\213\255\202\255\211\243\202\351", "\
13\255\202\255\217R\202\351"]
irb(main):023:0> 5.times do
irb(main):024:1* waza.each do |w|
irb(main):025:2* print(w)
irb(main):026:2> print(" ")
irb(main):027:2> end
irb(main):028:1> print("\n")
irb(main):029:1> end
殴る 蹴る 強く殴る 強く蹴る
殴る 蹴る 強く殴る 強く蹴る
殴る 蹴る 強く殴る 強く蹴る
殴る 蹴る 強く殴る 強く蹴る
殴る 蹴る 強く殴る 強く蹴る
=> 5

これも、printやputsと同じように結果はしっかりと文字化けせず表示されるのです。


使用OSはWindows XP Home Edition version2002 Service Pack 2です。
あまりよく分かっていないため、分かりにくく、ややこしい文ですが、回答をお待ちしています。よろしくお願いします。
状況等で詳しく知りたいところや何か分からない所がありましたら質問していただければ幸いです。分かる範囲で答えたいと思います。

参考になるかは分かりませんが、他の文字での文字化け例を下記します。
[1]左から順に入力したputs("こんにちは")

irb(main):035:0> puts("こんにちは")
こんにちは
=> nil
[2]先にputs("")を入力したputs("こんにちは")

irb(main):036:0> puts(" ア ノ ソ ヘ")
こんにちは
=> nil

[3]waza =["", "", "", ""]を先に入力後カーソル移動で日本語入力したwaza = ["殴る", "蹴る", "強く殴る", "強く蹴る"]

irb(main):037:0> waza =[" 」 ・, " R ・, " ュ ュ 」 ・, " ュ ュ R ・]
=> ["\211\243\202\351", "\217R\202\351", "\213\255\202\255\211\243\202\351", "\2
13\255\202\255\217R\202\351"]

irb(main):038:0> waza[0]
=> "\211\243\202\351"
irb(main):039:0> waza[1]
=> "\217R\202\351"

[4]wazaの要素の出力

irb(main):040:0> waza.each do |w|
irb(main):041:1* print(w)
irb(main):042:1> end
殴る蹴る強く殴る強く蹴る=> ["\211\243\202\351", "\217R\202\351", "\213\255\202\2
55\211\243\202\351", "\213\255\202\255\217R\202\351"]

A 回答 (3件)

入力時の表示の問題はRubyそのものではなく、Rubyから呼び出している外部ライブラリの


問題ですので、Rubyでどうこうすればという問題ではないです。

Readline for Windows
http://gnuwin32.sourceforge.net/packages/readlin …

つまりそういうものだと思ってあきらめるか、readlineの(Windowsでの)開発者を
捕まえて泣きつくなりしてください。

irb起動時に、rubyインタプリタを起動するのと同じオプションを
与えることができます。

>irb
irb(main):002:0> ["ほげ"]
=> ["\202\202\202\260"]
irb(main):003:0> $KCODE = "sjis"
=> "sjis"
irb(main):004:0> ["ほげ"]
=> ["ほげ"]

>irb -Ks
irb(main):001:0> ["ほげ"]
=> ["ほげ"]

ということで、文字コードとしてShiftJISを使うということを明示すれば
OKです。
いちいち起動時にオプションを与えるのが面倒というのであれば、
.irbrc というファイルを作成してその中にあらかじめ指定しておきたい
設定を記述しておけば起動時にオプション指定する必要はなくなります。

.irbrc の置き場所などはマニュアルを参照してください。

Rubyリファレンスマニュアル - irb
http://www.ruby-lang.org/ja/man/?cmd=view;name=irb

~ というのはUnixで使われるシェルで用いられる、ユーザーの
ホームディレクトリを表すものです。
Windows版であれば、環境変数 HOMEの値が用いられます。

~/.irbrc



%HOME%/.irbrc

のように読み替えてください。
この環境変数は通常は設定されませんので、ご自分の環境に合わせて
設定してください
(HOMEDRIVEとHOMEPATHならあらかじめ設定されていると思います)。
    • good
    • 0
この回答へのお礼

分かりました。ありがとうございました。

お礼日時:2007/10/29 23:04

すでに回答が出ていますが、補足です。


readline.dllの機能については、漢字コードの指定をSJISにすれば良いわけですが、Windowsの場合、ホームディレクトリという概念が希薄なので、.irbrcファイルよりも、環境変数設定で、RUBYOPT を -Ks とセットするのがいいと思います。
「One-Click Ruby Installer for Windows」を使うとそうなります。

別の手段としては、readline.dllを使わないと、一行入力処理はCMDプロンプト用のWindows標準のものになるので、SJISが正常に処理できます(当たり前)。
そのためには irb --noreadline で起動します。ただし一行入力処理がSJISなだけで、ruby自体の動作は -K オプション($KCODE)に従います。

後半についてですが、irbは入力した文の値に対してinspectというメソッドを適用してすべて文字列に変換して表示します。元々文字列の値にinspectメソッドを適用すると漢字コードがNONEの場合、バイト列とみなされ、ASCII印字可能文字でない0x00-0x1Fと0x7F-0xFFは\をつかった8進数で表示されます。また全体が""で囲まれます。
これも、irb --noinspect で起動することで動作を変えることが出来ます。この場合、値が文字列ならばそのままで、文字列でなければto_sメソッドで文字列化して表示されます。

rubyリファレンスのirb,$KCODE,inspect,to_sのあたりを参照。
    • good
    • 0
この回答へのお礼

補足説明ありがとうございました。
また色々参照しながらやっていこうと思います。

お礼日時:2007/10/29 23:05

入力時に化けるのは、ヒストリ機能だとか行編集を行うために使用している


readline というライブラリの制限のためです。
要はきちんとWindows上での日本語対応ができていないから。

二番目の問題は、これは文字化けではありません。
何もせずにirbを起動した場合、文字コードの指定がなされてないので
128 以上の値を持つバイトは八進表記で出力されるようになっています。

irb(main):001:0> ["ほげ"]
=> ["\202\331\202\260"]
irb(main):002:0> $KCODE
=> "NONE"
irb(main):003:0> $KCODE = "sjis"
=> "sjis"
irb(main):004:0> ["ほげ"]
=> ["ほげ"]
irb(main):005:0>
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
Windows上での日本語対応ができていないということは、これはもうこういう仕様なのだとして諦めるしかないのでしょうか?

二つ目のも、
>128 以上の値を持つバイトは八進表記で出力されるようになっています。
という回答から推測するに、そういう仕様だということでしょうか?
しかし、 何もせずに起動した場合 とも書かれているので、何か設定した上で起動すれば大丈夫。ということのようにも取れます。

出来れば、Windows上でのきちんとした日本語対応の仕方と、文字コードの指定の方法を教えていただけないでしょうか。お願いします。

お礼日時:2007/10/28 13:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!