编码:: UndefinedConversionError(Encoding::UndefinedC

2019-07-01 16:04发布

我不断收到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/)没有运气。

有任何想法吗?

Answer 1:

menu.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')

这完美地工作,我不得不更换一些额外的字符,但目前还没有更多的错误。



Answer 2:

你期待“\ 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评论。



Answer 3:

如果你不在乎失去了奇怪的字符,你可以吹他们离开:

str.force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '')


Answer 4:

您自动接受的解决方案不起作用,有效地没有任何错误,但它不是JSON。

我用OJ宝石,现在找工作解决了这个问题。 它也比标准的JSON库更快。

书面方式:

   menu_json = Oj.dump menu

读 :

   menu2 = Oj.load menu_json

https://github.com/ohler55/oj了解更多详情。 我希望这将有助于。



文章来源: Encoding::UndefinedConversionError