なんかRubyでない世界観で作られた日本語戻り値を受け取って加工してたら変なところでエラーになったのでメモ
環境
rails (5.2.0)
事象
以下のような test.txt
を用意する
悪霊退散
これを意図的に Shift-JIS
で読み込む
text = File.read("test.txt").force_encoding("SHIFT_JIS") # => "\x{E682}\xAA\x{E99C}\x{8AE9}\x80\x80\x{E695}\xA3"
そしてこれをハッシュの値にして to_json
しようとすると…
{result: text}.to_json # Encoding::InvalidByteSequenceError: "\x80" on Shift_JIS #
こんな感じでコケる。
ちなみに ascii-8bit
もコケる
text = File.read("test.txt").force_encoding("ascii-8bit") # => "\xE6\x82\xAA\xE9\x9C\x8A\xE9\x80\x80\xE6\x95\xA3" {result: text}.to_json # Encoding::UndefinedConversionError: "\xE6" from ASCII-8BIT to UTF-8 #
対策
いわずもがな、ちゃんとUTF-8にしてあげる。
{result: text.force_encoding("UTF-8")}.to_json => "{\"result\":\"悪霊退散\"}"