<ArgumentError: invalid byte sequence in US-ASCII>エラーを解決した時のメモです。
環境
問題
コメントに全角文字があるだけで、debuggerのところでエラーで落ちてしまう。
# frozen_string_literal: true require 'debug' arr = ["a", "b", "c"] #コメント arr.each do |a| debugger puts a.capitalize end
エラーログ
#<ArgumentError: invalid byte sequence in US-ASCII> ["/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.2/lib/reline/unicode.rb:71:in `ord'", "/home/rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.2/lib/reline/unicode.rb:71:in `block in escape_for_print'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.2/lib/reline/unicode.rb:70:in `map!'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/reline-0.3.2/lib/reline/unicode.rb:70:in `escape_for_print'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.6.2/lib/irb/color.rb:137:in `block in colorize_code'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.6.2/lib/irb/color.rb:190:in `block (2 levels) in scan'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.6.2/lib/irb/color.rb:203:in `block (2 levels) in scan'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.6.2/lib/irb/color.rb:201:in `each'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.6.2/lib/irb/color.rb:201:in `block in scan'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.6.2/lib/irb/ruby-lex.rb:45:in `rescue in compile_with_errors_suppressed'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.6.2/lib/irb/ruby-lex.rb:34:in `compile_with_errors_suppressed'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.6.2/lib/irb/color.rb:177:in `scan'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/debug-1.7.1/lib/debug/breakpoint.rb:69:in `suspend'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/debug-1.7.1/lib/debug/breakpoint.rb:178:in `block in setup'", "/home/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/debug-1.7.1/lib/debug/session.rb:2586:in `debugger'", "sample.rb:7:in `block in <main>'", "sample.rb:6:in `each'", "sample.rb:6:in `<main>'"]
解決策①
ファイルの先頭にマジックコメント# encoding: UTF-8
を付ける
解決策②
$ ruby -e 'puts Encoding.default_external' US-ASCII $ export RUBYOPT=-EUTF-8 $ ruby -e 'puts Encoding.default_external' UTF-8
調べたこと
ソースコード中のエンコーディングは、 magic comment などを記述しないと、US-ASCII になる
ソースコード中のリテラルのエンコーディングは、基本的に script encoding によって決定されます。script encoding はソースファイルごとに異なり、Ruby からは ENCODING で取得することができます。なお、script encoding として利用できるのは ASCII 互換なエンコーディングに限られます。後で述べる magic comment を記述しなかった場合、script encoidng は US-ASCII になります。よって、ソースコード中に 非 ASCII な文字列を書きたい場合は、次に説明する magic comment を書く必要があります。
Ruby M17N の設計と実装Rubyに唯一の内部コードは存在しない
JavaやPythonなど多くの言語では、内部で特定の言語に正規化し、入出力を変換するUCS Normalization 方式を採用しているが、Rubyでは、唯一の内部コードというものは存在せず、全てのエンコーディングを対等に扱うCSI方式を導入している(Ruby 1.9~)
p "aiueo".encoding # #<Encoding:UTF-8> p "aiueo".encode('US-ASCII').encoding # #<Encoding:US-ASCII>