1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windows + Rubyでgetsさせたときのエンコーディング

Last updated at Posted at 2020-08-13

初投稿です

すごい小ネタだと思いますが、意外と無い情報で、長らく迷ったので。
こういうところから少しずつ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回押す羽目になったりします。今の所この回避策はわかりません。まあ、気にするほどの挙動ではないので、今はとりあえずこれで乗り切ってみようかと。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?