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
が発生するらしい
文字列がそのエンコーディングにおいて不正なバイト列である場合に発生する例外。
通常エンコーディング変換時に発生します。
このスクラップは2022/02/24にクローズされました