编码::未定义转换错误 转储到json

3
我正在使用 gem fie 进行工作,但遇到了一个问题,我想解决,但是我做得很困难。Fie 是一个用于 Rails 的 gem。在其中,它有一些行代码存储了一个 ActiveRecord::Base 的 marshal dump 以 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'

挖掘中,我尝试了几个方法但是无法使其工作。看起来 marshal dump 是 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 Rails 5.2.1

我打开的git 问题


1
这里的object是什么意思?你有没有一种独立的方法来复现这个问题? - max pleaner
Marshal.dump 生成二进制数据,而二进制数据通常在 JSON 中进行 Base64 编码。你真的确定要使用 Marshal 来处理这个吗? - mu is too short
3
这个问题跟JSON有什么关系?你可以用更加简单的例子来重现这个错误:Marshal.dump(object).force_encoding("ASCII-8BIT").encode("UTF-8")。那么,object是什么?我们应该如何重现此错误?你实际上想达到什么目的? - Tom Lord
抱歉,我已经更新了问题。 - ChrisCPO
@maxpleaner 有什么想法吗? - ChrisCPO
@ChrisCPO 不确定,抱歉。 - max pleaner
1个回答

1
我遇到了这个问题,并通过使用以下方法解决了它:
Marshal.dump(value).force_encoding("ISO-8859-1").encode("UTF-8")

希望这能帮到你!

但正如Tom Lord所建议的那样,你应该更具体地描述你的问题,以帮助我们了解你想要实现什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接