コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RailsでUTF-8じゃない文字列が入ったハッシュをto_jsonしようとしてもできない

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

関連リンク