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

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

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

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Q&A

2回答

4557閲覧

rubyのgetsメソッドについて

geki

総合スコア4

Ruby

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

1グッド

2クリップ

投稿2018/07/13 13:01

前提・実現したいこと

コマンドプロンプト上で日本語を受け取り、受け取った結果を表示できるようにしたいです。
rubyのgetsメソッドを用いて実現しようとすると制御文字らしいものまで表示するようになってしまい、getsメソッドの挙動までおかしくなってしまいました。
コマンドプロンプトの文字コードはShift_JISで、ソースコードはUTF-8です。encodeメソッドでUTF-8に変換してもうまくいきません。

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

  • 実行結果
$ruby teststdin.rb あいうえお Traceback (most recent call last): 1: from teststdin.rb:2:in `<main>' teststdin.rb:2:in `encode': "\xA0" on Windows-31J (Encoding::InvalidByteSequenceError)
  • 問題点

getsメソッドで”あいうえお”を受け取っても実行されずもう一度エンターキーを押さないと実行されない。

該当のソースコード

Ruby

1# -*- coding: utf-8 -*- 2s1 = gets.chomp.encode("utf-8") 3puts s1

試したこと

chcp 65001のコマンドでコマンドプロンプトの文字コードをUTF-8に変えても文字化けしてしまいうまくいきませんでした。

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

Rubyのバージョンは2.5.1,OSはWindows [Version 10.0.17134.165]です。
また実行結果は入力する文字によってエラーメッセージがわずかに変わりました。

$ruby teststdin.rb かきくけこ Traceback (most recent call last): 1: from teststdin.rb:2:in `<main>' teststdin.rb:2:in `encode': "\xFF" on Windows-31J (Encoding::InvalidByteSequenceError)
DrqYuto👍を押しています

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

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

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

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

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

s8_chu

2020/01/03 01:26

質問が既に解決されているようなので、ベストアンサーの選択、もしくは自己回答を行って質問を解決済みにしていただけませんか?
guest

回答2

0

ruby

1str = gets.chomp 2puts "ENV['RUBYOPT'] = #{ENV['RUBYOPT']}" 3puts "__ENCODING__ = #{__ENCODING__} " 4puts "default_external = #{Encoding.default_external.inspect}" 5puts "default_internal = #{Encoding.default_internal.inspect}" 6puts "locale_charmap = #{Encoding.locale_charmap}" 7puts "str.encoding = #{str.encoding.inspect}" 8puts str 9p str

このスクリプトを実行して日本語入力するとどうなりますでしょうか?


追記

とりあえず、暫定的な対処療法としては

String#scrub
String#encodeのinvalid,replaceオプション

ですかね

サンプル

ruby

1puts gets.chomp.scrub('') 2puts gets.chomp.encode("utf-8", invalid: :replace, replace: '')

投稿2018/07/13 13:46

編集2018/07/14 04:36
asm

総合スコア15147

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

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

geki

2018/07/13 14:21

以下のような実行結果になりました ``` $ruby teststdin.rb あいうえお ENV['RUBYOPT'] = __ENCODING__ = UTF-8 default_external = #<Encoding:Windows-31J> default_internal = nil locale_charmap = CP932 str.encoding = #<Encoding:Windows-31J> ��あいうえお "\xA0\xFFあいうえお" ```
asm

2018/07/13 15:00

予想外の結果にちょっと驚いています。 もしかして、ブラウザあたりからコピペで日本語を入力されていますか? その場合頭に目には見えない空白が混じっている可能性があります
geki

2018/07/14 03:33

直接コンソールに入力日本語を入力しているはずなのですがこうなってしまいます。 なぜか文頭に半角英数字をいれると制御文字らしきものが抜けるので謎が深まっています。 ``` ruby teststdin.rb kあいうえお ENV['RUBYOPT'] = __ENCODING__ = UTF-8 default_external = #<Encoding:Windows-31J> default_internal = nil locale_charmap = CP932 str.encoding = #<Encoding:Windows-31J> kあいうえお "kあいうえお" ```
asm

2018/07/14 04:30

これは単なる興味ですが echo あいうえお| ruby teststdin.rb でも謎文字は混入するのでしょうか?
geki

2018/07/14 05:27

echoを使うと謎文字は混入しませんでした...。 ``` $echo あいうえお|ruby teststdin.rb ENV['RUBYOPT'] = __ENCODING__ = UTF-8 default_external = #<Encoding:Windows-31J> default_internal = nil locale_charmap = CP932 str.encoding = #<Encoding:Windows-31J> あいうえお "あいうえお" ```
geki

2018/07/14 05:56

追記拝見させていただきました、ありがとうございます。全く知らなかったメソッドについて知ることができて勉強になりました。 ただサンプル通りにやってもなぜかうまくいきませんでした。 具体的にはscrubが不正バイト文字を検出せず、うまく置換してくれないことがわかりました。 いろいろ試行錯誤してみた結果以下のソースコードで多少増しに動くようになりました ``` # -*- coding: utf-8 -*- str = gets.chomp.encode("SJIS", :invalid=>:replace, replace: '') p str ``` 実行結果は以下の通りです。 ``` ruby teststdin.rb あいうえお "あいうえお" ``` ただ、なぜか2行入力を求めてしまうのと、漢字を入力すると不正バイト文字を検出してくれないという問題が発生しました。 もうコンソールを変えてみるかなという感じがしています。
asm

2018/07/14 05:58 編集

IMEかコマンドプロンプト(というかターミナルエミュレータ)の問題な気がしますね ありゃ、scrubではダメでしたか
geki

2018/07/14 05:59

丁寧にありがとうございました。 IMEに関してもう少し調べてみることにします。
kororin

2019/05/11 23:47

私のPCでも同じことが起こっており、困っています。 rubyは2.6.3を使用しています。 gekiさんの報告にあるように"あいうえお"と入力すると、先頭に"\xA0\xFF"が挿入されますが、"いうえお"と入力すると先頭は"\xA2\xFF"となります。 "\xA0"はinvalidなのでasmさんの方法で文字を入れ替えたり削除したりすることはできるのですが、"\xA2"はvalidなコードなので、そのまま残ってしまいます。 ちなみにWSLのbashで同じコードを走らせ同じことをしてみると、そもそも入力される値が異なり問題は発生しません。 うまい解決策があるとよいのですが...
kororin

2019/05/12 01:25

ありがとうございます! 問題が解消しました!
guest

0

Ruby

1s1 = gets.chomp 2p s1 3s2 = s1.encode("utf-8") 4p s2 5puts s2

だとどうなりますか?

投稿2018/07/13 13:28

otn

総合スコア84555

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

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

geki

2018/07/13 14:18

以下のような実行結果になりました ``` $ruby teststdin.rb あいうえお "\xA0\xFFあいうえお" Traceback (most recent call last): 1: from teststdin.rb:4:in `<main>' teststdin.rb:4:in `encode': "\xA0" on Windows-31J (Encoding::InvalidByteSequenceError) ```
otn

2018/07/13 15:04

「あいうえお」じゃなくて、「abc」だとどうなりますか?
geki

2018/07/14 03:35

以下のようになりました。 ``` $ruby teststdin.rb abc "abc" "abc" abc ```
otn

2018/07/14 10:06

「あいうえお」をメモ帳からコピペするとどうなりますか? あと、 > $ruby teststdin.rb の$が気になりますが、コマンドプロンプト(cmd.exe)からの入力では無いのでしょうか? コマンドプロンプトに変わるツールを使っているなら、それの問題かも。
otn

2020/01/03 00:39

Windows7だと大丈夫で、Windows10だと現象が出ますね。 Rubyのメーリングリストに投げてみます。
s8_chu

2020/01/03 01:25 編集

otn さん> 詳細なことはわかりませんが、他回答へのコメントに書かれているリンク先によれば、「Windows 10 で導入された新しいコンソールに起因するバグ」らしいです。 https://ja.stackoverflow.com/q/54578
otn

2020/01/03 01:32 編集

ああ、これ読んだ。すっかり忘れてました。 ありがとうございます。 MS的に既知のバグは出力に関することで、それは修正されたが、入力に関してはまだ修正されていないということですかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問