なんか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\":\"悪霊退散\"}"