Closed3

Rubyのgetsで日本語を入力すると文字化けする

ピン留めされたアイテム
クノスクノス

Rubyで標準入力を受け取るにはgetsを使う
英数字なら問題なく使えるが、例えばファイルパスを受け取ろうと日本語入力すると入力した文字列が文字化けしてしまう

test.rb
# coding: utf-8

print "ファイルパスを入力してください: "
file_pass_str = gets.chomp

puts file_pass_str
実行
> ruby test.rb
ファイルパスを入力してください: C:\hoge\テスト
C:\hoge\�e�X�g -> 文字化け

環境

  • Windows10
  • Ruby 3.1.1
クノスクノス

UTF-8に変換してみる

Rubyの実行引数にファイルパスを指定するときも、そのままだと文字化けする
これはコマンドプロンプトとRuby内で文字コードが違うため

  • コマンドプロンプトはSJISで扱う
  • Ruby内はUFT-8で扱う
    • Rubyのインストール時のオプションで「Use UTF-8 as defalt external encoding.」にチェックを入れると規定の文字コードがUTF-8になる
      • いつの間にかインストール時のオプションからなくなってる?
test.rb
# coding: utf-8
folder_pass = ARGV[0].encode(Encoding::UTF_8).gsub("\\", "/")
puts ARGV[0]
puts folder_pass
実行
> ruby test.rb C:\hoge\テスト
C:\hoge\テスト
C:/hoge/テスト

……あれ?文字化けしてないな?
このスクラップ書く直前にRubyのバージョンアップ(3.0.2から)したからか?

クノスクノス
実行
> ruby test.rb
ファイルパスを入力してください: C:\hoge\テスト
C:\hoge\テスト

Rubyアプデしたら直ったわ……w(冒頭の文字化けするのはアプデ直前の実行結果)

おや?

実行
> ruby test.rb
ファイルパスを入力してください: あああ

test.rb:24:in `gets': "\\xA0" on Windows-31J (Encoding::InvalidByteSequenceError)
        from test.rb:24:in `gets'
        from test.rb:24:in `<main>'

どうやらgetsで受け取る一文字目が「あ」だとEncoding::InvalidByteSequenceErrorが発生するらしい

https://docs.ruby-lang.org/ja/latest/class/Encoding=3a=3aInvalidByteSequenceError.html

文字列がそのエンコーディングにおいて不正なバイト列である場合に発生する例外。
通常エンコーディング変換時に発生します。

このスクラップは2022/02/24にクローズされました