编码:: UndefinedConversionError转储到json

时间:2019-04-01 02:08:41

标签: json ruby encoding

我正在使用宝石fie,遇到了我想解决的该宝石问题,但是我在这样做时遇到了麻烦。 Fie是Rails的瑰宝。在其中,它有几行在json中存储ActiveRecord::Base的编组转储,但是我遇到了编码错误。尽管可以使用Rails 5.2和更高版本,但我已经能够在不同的机器和ROR版本之间复制它。

最简单的复制方法是:

[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

红宝石2.5.1 Rails 5.2.1

git issue我打开了

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题,并使用以下方法解决了该问题:

Marshal.dump(value).force_encoding("ISO-8859-1").encode("UTF-8")

希望有帮助!

但是Tom Lord建议您对问题进行更具体的说明,以帮助我们了解您要实现的目标。