我不断收到Encoding::UndefinedConversionError - "\xC2" from ASCII-8BIT to UTF-8
每次我尝试将哈希转换成JSON字符串的时间。 我试着用[.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ])
[.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ])
链接.encode
与.force_encoding
,向后切换参数,但似乎没有任何工作,所以我抓住了错误是这样的:
begin
menu.to_json
rescue Encoding::UndefinedConversionError
puts $!.error_char.dump
p $!.error_char.encoding
end
当菜单续集与从MySQL数据库,utf8_general_ci编码内容dataset.to_hash并返回此:
“\ XC2”
<#Encoding:ASCII-8BIT>
编码从未改变,无论什么.encode
/ .force_encoding
我使用。 我甚至一直试图替换字符串.gsub!(/\\\xC2/)
没有运气。
有任何想法吗?
menu.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
这完美地工作,我不得不更换一些额外的字符,但目前还没有更多的错误。
你期待“\ XC2”什么? 可能是一个Â
随着ASCII-8BIT你有二进制数据,红宝石不能决定,应该是什么。
你必须先设置与编码force_encoding
。
你可以试试下面的代码:
Encoding.list.each{|enc|
begin
print "%-10s\t" % [enc]
print "\t\xC2".force_encoding(enc)
print "\t\xC2".force_encoding(enc).encode('utf-8')
rescue => err
print "\t#{err}"
end
print "\n"
}
其结果是在你的“\ XC2”不同编码的可能值。
其结果可能取决于你的输出格式,但我认为你可以做一个很好的猜测,你有哪种编码。
当你定义的编码,你需要(可能是CP1251),你可以
menu.force_encoding('cp1252').to_json
又见Kashyaps评论。
如果你不在乎失去了奇怪的字符,你可以吹他们离开:
str.force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '')
您自动接受的解决方案不起作用,有效地没有任何错误,但它不是JSON。
我用OJ宝石,现在找工作解决了这个问题。 它也比标准的JSON库更快。
书面方式:
menu_json = Oj.dump menu
读 :
menu2 = Oj.load menu_json
https://github.com/ohler55/oj了解更多详情。 我希望这将有助于。