質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

1357閲覧

Ruby 文字化け console使用

read_blue2

総合スコア13

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/02/20 12:21

Ruby

1kikkyo = ["大吉", "中吉", "小吉", "末吉", "凶"] 2a = rand(5) 3puts "名前を入れてください" 4name = gets 5puts name, "さんの運勢は", kikkyo[a], "です!" 6

前提・実現したいこと

ネット上で参照した以下のコードで、文字入力の際に。全角のひらがな、カタカナ入力すると文字化けしてしまい改善したいです。(半角英字では、文字化けせず)

発生している問題・エラーメッセージ

`名前を入れてください
はの
�͂�
さんの運勢は
末吉
です!

該当のソースコード

kikkyo = ["大吉", "中吉", "小吉", "末吉", "凶"]
a = rand(5)
puts "名前を入れてください"
name = gets
puts name, "さんの運勢は", kikkyo[a], "です!"

試したこと

文字コードをUTF-8で保存していること確認。
色々と調べたのですが、gets の文法の問題なのか環境の問題なのかよくわからず、、

補足情報(FW/ツールのバージョンなど)

どうぞ、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

archiver

2018/02/20 12:34

動かしている環境は何ですか?(Windows、Linux、MacOS?)
read_blue2

2018/02/21 00:32

ご返信おそくなってしまい、申し訳ございません。ありがとうございます。Windows10です。
guest

回答3

0

ベストアンサー

私の環境だと,Encoding.default_external がデフォルトの CP932 の場合,文字化けは起きず,UTF-8 にすると化けました。

私の環境,というのは,Ruby が

ruby 2.4.2p198 (2017-09-14 revision 59899) [x64-mingw32]

および

ruby 2.5.0p0 (2017-12-25 revision 61468) [x64-mingw32]

です。(同じ結果)

これらの Ruby を通常のコマンドライン(cmd.exe)で動かしています。

もしかすると,デフォルト値が UTF-8 になっているのかもしれません。

rb

1Encoding.default_external = "cp932"

としたらどうなりますか。

化け方を見ると,Windows 31J(CP932)の「はの」を無理に UTF-8 と解釈しようとしたときの化け方ですね。

以下,ちょっとややこしいですが,この文字化けについて説明します。

Windows 31J で「は」「の」のバイト列はそれぞれ「82 CD」「82 CC」です。
これをつなげると「82 CD 82 CC」ですね。
これを UTF-8 として解釈しようとするとどうなるか。

UTF-8 では文字の先頭バイトが 82 というのはあり得ないので,ここは解釈不能になります。

次の「CD」ですが,これは次のバイトと合わせて,二バイトで一つの文字を表すはずの値です。
次のバイトと合わせた「CD 82」という並びは U+0342 という文字に解釈されます。
参考:
https://codepoints.net/U+0342
よくは知りませんが,ギリシャ語で曲アクセントを表す付加記号のようです。本来はギリシャ文字の母音の上に載せます。
見た目は,フォントによってチルダ「~」に似ていてたり,サーカムフレックス「^」に似ていたりすると思います。

実際,ご質問本文の文字化け部分の文字コードを調べると,真ん中の文字が U+0342 になっています。

次の「CC」ですが,こちらも次のバイトと合わせて,二バイトで一つの文字を表すものなのですが,次のバイトが無いので,解釈不能,となってしまいます。

解釈不能のところは「�」(U+FFFD)に置き換えられる仕様なので,�͂� となるんですね。

投稿2018/02/21 03:28

scivola

総合スコア2108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

read_blue2

2018/02/21 11:56

試したら、文字化けなくなりました! 文字コードの問題だったのですね!文字コードの補足もありがとうございました!理屈を具体的に丁寧に教えてくださり、とても分かりやすく嬉しかったですご親切に教えていただいたおかげで、プログラミングに対してより理解、試行したいという気持ちが増えました。。この度は、本当にありがとうございました。
guest

0

Windows なら

rb

1Encoding.default_external = "utf-8"

を先頭に入れておくと直るかもしれません。
外部とのやり取りのデフォルトの文字コードです。指定しないと Windows 31J(CP932)だったりします。

なお,ご質問の内容とはまったく関係ありませんが,

rb

1kikkyo = ["大吉", "中吉", "小吉", "末吉", "凶"]

rb

1kikkyo = %w(大吉 中吉 小吉 末吉 凶)

と書くこともできます。

また,kikkyo の中から一つをランダムに取り出すには,

rb

1kikkyo.sample

とするのがいいでしょう。

puts に複数の引数を与えると,いちいち改行してくれますが,一行で表示させるにはたとえば式展開というものを用いて

rb

1puts "#{name}さんの運勢は#{kikkyo[a]}です!"

などと書くことができます。

投稿2018/02/20 14:42

scivola

総合スコア2108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

read_blue2

2018/02/21 00:48

ありがとうございます。ご返信遅くなってしまい、すみません。 window10です。冒頭に入れてみましたが、同じくエラーがでてしまっています。。 そして、他のコードの書き方、ありがとうございました!!こうやると、より分かりやすく書けるんだと凄く参考になりました。ありがとうございます。
asm

2018/02/21 06:08 編集

(追記:windowsでは)default_externalはCP932じゃないと日本語入力できない筈
scivola

2018/02/21 03:21

Windows が使えるところに来たので試しました。 私の環境だと, Encoding.default_external = "utf-8" にしたら文字化けし,デフォルトの CP932 だと化けませんでした。 あてずっぽでいい加減なことを書いてすいません。
scivola

2018/02/21 03:21

これに関して,もう少し調べたことを別回答で書きます。
guest

0

理由は分からないので
Rubyのお作法としてのアプローチなのですが、

Ruby

1name = gets.chomp

として、getsの最後尾に着いてしまう改行文字を切り捨てたらどうなりますか?

投稿2018/02/20 14:00

ReiLeiLei1025

総合スコア236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

read_blue2

2018/02/21 00:43

ありがとうございます。ご返信遅くなってしまい、すみません。 試してみましたが、空欄になります。 名前を入れてください はの さんの運勢は 中吉 です! 以下のように、コードを変更しました。 name = gets.chomp puts name,"さんの運勢は", kikkyo[a], "です!"
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問