
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"]
No.2ベストアンサー
- 回答日時:
入力時の表示の問題は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ならあらかじめ設定されていると思います)。
No.3
- 回答日時:
すでに回答が出ていますが、補足です。
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のあたりを参照。
No.1
- 回答日時:
入力時に化けるのは、ヒストリ機能だとか行編集を行うために使用している
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>
回答ありがとうございます。
Windows上での日本語対応ができていないということは、これはもうこういう仕様なのだとして諦めるしかないのでしょうか?
二つ目のも、
>128 以上の値を持つバイトは八進表記で出力されるようになっています。
という回答から推測するに、そういう仕様だということでしょうか?
しかし、 何もせずに起動した場合 とも書かれているので、何か設定した上で起動すれば大丈夫。ということのようにも取れます。
出来れば、Windows上でのきちんとした日本語対応の仕方と、文字コードの指定の方法を教えていただけないでしょうか。お願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) プログラミング python 3 2023/06/14 03:55
- Perl perlについての質問 2 2022/10/17 15:25
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- その他(家族・家庭) 親の暴力について 2 2022/09/21 23:52
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
シェルスクリプトで、空白(ス...
-
画面上再読み込みをさせたいの...
-
pythonの この問題が分かりませ...
-
【至急!!!】python言語で本を見...
-
Pythonでコンソールをクリアす...
-
I2C接続のLCDディスプレイを使う
-
16進の10進変換について
-
関数「exists」と「defined」の...
-
全然分からず困っています。習...
-
UWSCのSELECT文の記述方法
-
pythonを使ったプログラミング...
-
PerlのDate::Simpleが動かない?
-
CGIでimgタグでalignを使うとエ...
-
JSONで文字列が長い時
-
検索するには?
-
MSXMLでの属性の存在確認法
-
arduino の割り込み処理について
-
構造体の各データの表示につい...
-
Application.ScreenUpdating = ...
-
リストの項目を表示のみで、選...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
シェルスクリプトで、空白(ス...
-
16進の10進変換について
-
Pythonでコンソールをクリアす...
-
【至急!!!】python言語で本を見...
-
c言語 16進数の2進数への変換
-
関数「exists」と「defined」の...
-
変数名に変数を使用
-
変数の中は文字列か数値か調べ...
-
eval文中の+
-
ソケットでのデータ送受信につ...
-
awk の int()に関数について
-
アカウントプログラムについて
-
I2C接続のLCDディスプレイを使う
-
ダブルクォーテーションの中に...
-
動的ハッシュを作って取り出し...
-
PerlのDate::Simpleが動かない?
-
pythonで演算子を変数に代入す...
-
python'高階関数'について
-
「HSP」でキャラコードを使って...
-
pythonで改行を含めてfindする方法
おすすめ情報