【问题标题】:Encoding::UndefinedConversionError dump to json编码::UndefinedConversionError 转储到 json
【发布时间】:2019-04-01 02:08:41
【问题描述】:

我正在使用 gem fie 并遇到了我想解决的这个 gem 的问题,但是我在这样做时遇到了麻烦。 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 ant 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 导轨 5.2.1

git issue我打开了

【问题讨论】:

  • 这里的对象是什么?你有一个独立的方法来重现这个吗?
  • Marshal.dump 生成二进制数据,而二进制数据通常以 JSON 格式进行 Base64 编码。您确定要为此使用 Marshal 吗?
  • 这个问题和 JSON 有什么关系?据推测,您可以通过更 Minimal 示例重现错误:Marshal.dump(object).force_encoding("ASCII-8BIT").encode("UTF-8")?那么,object 是什么?我们怎样才能重现这个?你到底想达到什么目的>
  • 对不起,我已经更新了问题。
  • @maxpleaner 任何想法。

标签: json ruby encoding


【解决方案1】:

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

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

希望对你有所帮助!

但正如Tom Lord 建议的那样,您应该更具体地提出您的问题,以帮助我们了解您想要实现的目标。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 2015-02-23
    • 2023-03-08
    • 2014-08-26
    • 2017-10-02
    • 2013-05-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    相关资源
    最近更新 更多