Ruby/Mongo-字符串无效UTF-8(BSON::InvalidStringCodeing)

Ruby/Mongo-字符串无效UTF-8(BSON::InvalidStringCodeing),ruby,mongodb,hash,utf-8,Ruby,Mongodb,Hash,Utf 8,我正在存储大型对象,这是一个巨大的散列,包含嵌套的散列、数组、字符串等。 这是一个非常相似的问题。这将提供以下猴子补丁: class Hash def to_utf8 Hash[ self.collect do |k, v| if (v.respond_to?(:to_utf8)) [ k, v.to_utf8 ] elsif (v.respond_to?(:encoding))

我正在存储大型对象,这是一个巨大的散列,包含嵌套的散列、数组、字符串等。 这是一个非常相似的问题。这将提供以下猴子补丁:

class Hash
  def to_utf8
    Hash[
        self.collect do |k, v|
          if (v.respond_to?(:to_utf8))
            [ k, v.to_utf8 ]
          elsif (v.respond_to?(:encoding))
            [ k, v.dup.encode('UTF-8') ]
          else
            [ k, v ]
          end
        end
    ]
  end
end

这个答案很好,但似乎没有超过1级,我不知道如何重构它以爬行通过。

如果可能的话,与其修复症状,不如尝试从源头解决问题。在应用程序堆栈的某个地方,编码是倾斜的。如果你能把它修好,这可能是最稳定、最有效的方法

否则,您将不得不遍历整个MongoDB文档,并使用此处所做的操作来调整值(不要忘记键,它们在MongoDB中也存储为字符串):

if text.respond_to?(:to_utf8)
  text.to_utf8
elsif text.respond_to?(:encoding)
  text.encode('utf-8')
else
  text
end
关于如何遍历文档,我无法帮助您,因为我需要更多关于您的模型结构以及它是如何持久化的信息

编辑:

我喜欢这个解决方案,而不是遍历模型树:。将其视为JSON,并对整个文档进行编码/解码,修复过程中的UTF-8编码问题