Encoding :: UndefinedConversionError - дамп в json - PullRequest
1 голос
/ 01 апреля 2019

Я работаю с самоцветом тьфу и столкнулся с проблемой с этим самоцветом, которую я хотел бы решить, однако у меня возникли проблемы с этим. Fie - это драгоценный камень для Rails. В нем есть несколько строк, в которых хранится маршальный дамп ActiveRecord::Base в json, однако я сталкиваюсь с ошибкой кодирования. Мне удалось воспроизвести это на разных машинах и версиях ROR, хотя Rails 5.2 и выше.

Самый простой способ воспроизвести это:

[5] pry(main)> Marshal.dump(User.first).to_json
  User Load (29.8ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 1]]
Encoding::UndefinedConversionError: "\x80" from ASCII-8BIT to UTF-8
from /home/chris/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.1/lib/active_support/core_ext/object/json.rb:38:in `encode'

Копаем Я попробовал несколько вещей, но не смог заставить его работать. Похоже, что дамп маршала - ASCII-8BIT, а Json - UTF-8bit. Я не смог форсировать кодировку.

> User.first.to_json.encoding
=> #<Encoding:UTF-8>
> Marshal.dump(User.first).encoding
=> #<Encoding:ASCII-8BIT>
> { foo: Marshal.dump(object).force_encoding("ASCII-8BIT").encode("UTF-8") }.to_json
Encoding::UndefinedConversionError: "\x80" from ASCII-8BIT to UTF-8
from (pry):139:in `encode'
> { foo: Marshal.dump(object).force_encoding("ISO-8859-1").encode("ASCII-8BIT") }.to_json
Encoding::UndefinedConversionError: U+0080 to ASCII-8BIT in conversion from ISO-8859-1 to UTF-8 to ASCII-8BIT

ruby ​​2.5.1 Рельсы 5.2.1

git выпуск я открыл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...