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

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

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

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

Q&A

解決済

2回答

1195閲覧

Rubyのプログラム内のgtes.chompで日本語が入力できず消えてしまう。

ahonoko

総合スコア1

Ruby

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

0グッド

0クリップ

投稿2020/05/31 13:28

###状況
「作りながら学ぶRuby入門」という本の第3部の最後の課題をやっています。
蔵書を検索機能を追加しなさい、という課題です。プログラムは動くのですが、日本語の入力を受け付けません。
受け付けないというのは文字化けを起こすのではなく、入力してEnterキーを押すと消えてしまいます。
そこでプログラムが停止してしまいます。
英字で書いた場合は入力はできるのですが、該当データがないので何もかえってきません。

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

検索をかけるために日本語を入力するとターミナルが以下の状態で固まります。 C:\Users\○○\Desktop\lesson-ruby\ruby_12>exam12.rb 1.蔵書データの登録 2.蔵書データの表示 3.蔵書データの検索 9.終了 番号を選んでください(1,2,9,3)3 書籍名:

該当のソースコード

Ruby

1def searchBookInfo 2 book_info = BookInfo.new("", "", 0, nil) 3 4 print "\n" 5 #print 'キー' 6 #print gets.chomp 7 print '書籍名:' 8 book_info.title = gets.chomp.encode('shift_jis').to_s 9 print '著者名:' 10 book_info.author = gets.chomp.encode('shift_jis').to_s 11 print 'ページ数:' 12 book_info.page = gets.chomp.to_i 13 print '発刊年:' 14 year = gets.chomp.to_i 15 print '発刊月:' 16 month = gets.chomp.to_i 17 print '発刊日:' 18 day = gets.chomp.to_i 19 book_info.publish_date = Date.new(year, month, day) 20 21 @book_infos[key] = book_info 22 23 search = book_info 24 25 @book_infos.each do |key, info| 26 search_flag = 1 27 input_check = 0 28 if search.title != '' 29 search_flag = 0 if search.title =~ /[^"#{info.title}"]/ 30 31 else 32 input_check += 1 33 end 34 if search.author != '' 35 search_flag = 0 if search.author != info.author 36 else 37 input_check += 1 38 end 39 if search.page != 0 40 search_flag = 0 if search.page != info.page 41 else 42 input_check += 1 43 end 44 if !search.pdate.nil? 45 search_flag = 0 if search.pdate != info.pdate 46 else 47 input_check += 1 48 end 49 50 # 比較が全て一致した蔵書データをハッシュに格納する 51 found_book[key] = info if search_flag == 1 && input_check < 4 52 end 53 54 puts "\n------------------------------" 55 if !found_book.empty? 56 # 全て一致した蔵書データを表示 57 found_book.each do |info| 58 print info.toFormattedString 59 puts "\n------------------------------" 60 end 61 else 62 print '条件に一致する蔵書はなし' 63 puts "\n------------------------------" 64 end 65 end

試したこと

WindowsのPCを使っているので文字コードの問題かと思い、gets.chompにコードの指定を付けましたが特に改善はされませんでした。
ネットで調べましたが同様の症状のものは見つけられませんでした。

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

Vertion
ruby 2.5.7p206 (2019-10-01 revision 67816) [x64-mingw32]
unicode対応でないプログラム言語はUTF-8ではなく日本語に設定しています。

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

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

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

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

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

otn

2020/05/31 14:09

> unicode対応でないプログラム言語はUTF-8ではなく日本語に設定しています。 どういう意味ですか?
ahonoko

2020/05/31 14:24

UTF-16で表示できないプログラム(アプリ・ソフト)に表示する際UTF-8ではなく日本語の文字コードを使う設定になっています。説明がへたくそですみません。
otn

2020/05/31 15:00

エディタかIDEか何かの設定の話ですか? 実行はコマンドプロンプトからやっているんですよね?それとも、何らかのIDEの中で実行ですか?
ahonoko

2020/05/31 15:02

PC自体の設定のはなしです。 プログラムはVscode内のターミナルから実行しています。
guest

回答2

0

ベストアンサー

PC自体の設定のはなしです。

Windowsの設定ですか?そんな設定あったかな。

プログラムはVscode内のターミナルから実行しています。

以下の手順で実行してください。
1.VScodeからでなく、直接コマンドプロンプトを開く
2.左上角をクリックして、プロパティで、「レガシーコンソールを使用する」をチェックする
3.コマンドプロンプトを一度閉じて開き直す
4.cd \Users\○○\Desktop\lesson-ruby\ruby_12で目的ディレクトリに移動する
5.exam12.rb実行

レガシーコンソールを使用するのは、コマンドプロンプトの日本語入力バグの回避のためです。

投稿2020/05/31 15:28

otn

総合スコア85901

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

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

ahonoko

2020/06/01 13:03 編集

丁寧にお答えいただきありがとうございます。 教えていただいたとおりにやってみましたが、文字化けするようになり、依然として日本語入力ができません。
otn

2020/06/01 13:09

> 文字化けするようになり、 何をしたらどうなりますか?
otn

2020/06/01 13:11

↑コマンドプロンプトの内容をコピペしろという意味です。
ahonoko

2020/06/01 13:16 編集

説明が足りずすみません。 書いていただいたようにコマンドプロンプトの【レガシーコンソールを使用する】にチェックを入れ、 閉じて開きなおしました。そのあとコマンドプロンプトからファイルのある場所に移動し、ファイルを実行したのですが、 1.蔵書データの登録 2.蔵書データの表示 3.蔵書データの検索 9.終了 番号を選んでください(1,2,9,3)3 書籍名: の部分が四角でかこまれたはてなマークになっていました。 入力に関しても数字とアルファベットの入力はできるのですが日本語入力できませんでした。半角全角を押しても切り替わりません。
otn

2020/06/01 13:30

Rubyプログラムを起動せず、コマンドプロンプトにそのまま日本語は入力できますか? 環境変数RUBYOPTに何か設定されてますか?
ahonoko

2020/06/01 13:37

コマンドプロンプト事態に日本語入力ができません。 環境変数RUBYOPTはありません
otn

2020/06/01 13:41

>コマンドプロンプト事態に日本語入力ができません。 であれば、それをまず解決しないと。
ahonoko

2020/06/01 13:57

自己解決しました。 ありがとうございます。いろいろ試してみてなぜかできました。 原因がわからないのでもう少し詳しく調べることにします。 何度も返信をくださってありがとうございました。
guest

0

コマンドプロンプトの設定について
コマンドプロンプトを開く → 規定値 → レガシーコンソールを使用するのチェックを外す。
チェックをつけているとVScode内で使えないようです。
ただ外すと直接コマンドプロンプトを使おうとしたときに文字色がなぜか黒になって一見画面が真っ暗になります。

システムロケールの設定について
1.スタートメニューから設定を開く 
2.時刻と言語 → 地域
3.関連設定の中の【日付、時刻、地域の追加設定】 → 地域
4.管理タブを開き「システムロケールの変更」→ ベータ:ワールドワイド~~utf-8を使用 にチェックを入れる
パソコンを再起動。

これで日本語の入力ができるようになるが、プログラムを動かしているときに入力するためには、一度アルファベットを打ってから消さないと日本語が打っても消えてしまう。
これが謎。
応急処置として、入力前にアルファベットを打つと日本語入力できる。
根本的な原因はわかりませんでした。
わかる方は教えてください。

投稿2020/06/01 14:08

ahonoko

総合スコア1

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

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

otn

2020/06/01 14:15

> 4.管理タブを開き「システムロケールの変更」→ ベータ:ワールドワイド~~utf-8を使用 にチェックを入れる これが具体的にどういう動作をするか把握したうえで使っていますか? もしかすると、Rubyへの入力がWindows-31JじゃなくてUTF-8になってしまうのでは? であれば、それ前提でプログラムを書かないと。
ahonoko

2020/06/01 14:33

おっしゃる通りです。 Rubyへの入力がUTF-8になっています。 Rubyのサポートする文字コードに含まれていたので大丈夫だと思ったのですが プログラムの記述方法に文字コードによる違いはあるのでしょうか? 読んだり書いたりする分にはVscode内で指定できるので問題はなさそうなのですがどうですか?
otn

2020/06/01 14:50

Encoding.default_external = "utf-8" と最初の方に書くか、 別の質問に回答した、起動オプションの -Eutf-8 ですね。 外部とのやりとりのデフォルトのエンコーディングをutf-8にします。
ahonoko

2020/06/01 15:13

Encoding.default_external = "utf-8"をプログラムの一番上に書いたのですがやはり日本語を入力すると消えてしまいました。レガシーコンソールを使用するの状態にもなっています。 起動オプションとはどのように設定するのでしょうか?
otn

2020/06/01 15:36

> やはり日本語を入力すると消えてしまいました。 ロケールの設定を変えてみましたが、コマンドプロンプトの日本語入力がまともに使えなさそうですよ。 なぜそういう設定にしたのでしょうか? とりあえず、コマンドプロンプトで日本語を使うときは、ロケールの utf-8 のチェックを外しましょう。 > 起動オプションとはどのように設定するのでしょうか? 環境変数RUBYOPTです。
ahonoko

2020/06/01 16:00

本当にありがとうございます。 やってみます。 確認なのですが Ruby 内の文字コードとコマンドプロンプトの文字コードが違っているためにこのような症状が起きてるという認識でよかったでしょうか?utf-8に統一することで解決するのでしょうか? いくつも続けて質問してしまいすみません。
otn

2020/06/01 23:15

文字化けはそうですね。 入力できないというのは、Rubyの問題じゃなくてWindowsの問題です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問