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编码问题