初投稿です
すごい小ネタだと思いますが、意外と無い情報で、長らく迷ったので。
こういうところから少しずつqiitaに参加していこうと思います。
悩んだこと
Windows 10 + Ruby 2.7.0 で gets させたものを表示するプログラム。
miss.rb
str = gets.chomp
puts str
これだけなんですが、putsで日本語を入力するとどうしても文字化けしていました。
普段VSCodeを使っており、そのコンソールとRubyの相性なのかと思いましたが、コマンドプロンプトでもだめ。
Ruby側のエンコーディングをいじったり、ググる中でruby Ksなんて古い(廃止された)記法に惑わされたりしましたが、結局は次項のようにすると無事表示されました。
解決策
correct.rb
STDIN.set_encoding "Windows-31J"
str = gets.chomp
puts str.encode("Windows-31J", invalid: :replace, replace: '')
つまるところ、
- Windowsのコンソール入出力のエンコードはWindows-31J
- なので、まずRubyの標準入力の文字コードをそれに合わせてやる(1行目)
- しかし、このままだと初めに意味をなさない文字がついてくるので、これを3行目の記述で落としてやる
ということ(だと思います)。
※このあと eval などに文字列を渡しても(もちろん元のstrが文法的に意味を為せばですが)ちゃんと動きました。 ←本当にやりたかったのはこっち
ただこれでも完璧ではなくて、getsで全角文字が含まれると改行が上手く認識されず、Enterキーを2回押す羽目になったりします。今の所この回避策はわかりません。まあ、気にするほどの挙動ではないので、今はとりあえずこれで乗り切ってみようかと。