编码:: UndefinedConversionError

mar*_*iay 36 ruby encoding sinatra sequel

Encoding::UndefinedConversionError - "\xC2" from ASCII-8BIT to UTF-8每次我尝试将哈希转换为JSON字符串时,我都会继续获取.我试着用[.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
Run Code Online (Sandbox Code Playgroud)

菜单是续集的dataset.to_hash,内容来自MySQL DB,utf8_general_ci编码并返回:

"\ XC2"

<#Encoding:ASCII-8BIT>

无论我.encode/ .force_encoding我使用什么,编码都不会改变.我甚至试图在.gsub!(/\\\xC2/)没有运气的情况下更换琴弦.

有任何想法吗?

mar*_*iay 77

menu.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
Run Code Online (Sandbox Code Playgroud)

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

  • 神奇的解决方案 - 解决了我在SQL Server中处理奇怪类型的问题.谢谢! (2认同)

knu*_*nut 19

你对"\ xC2"有什么期望?可能是一个Â

使用ASCII-8BIT你有二进制数据,并且ruby不能决定应该是什么.

您必须先使用设置编码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"
}
Run Code Online (Sandbox Code Playgroud)

结果是"\ xC2"的不同编码中的可能值.

结果可能取决于您的输出格式,但我认为您可以做出一个很好的猜测,你有哪种编码.

当您定义所需的编码(可能是cp1251)时,您可以

menu.force_encoding('cp1252').to_json
Run Code Online (Sandbox Code Playgroud)

另见Kashyaps评论.


Pon*_*nny 11

如果你不关心丢失奇怪的角色,你可以把它们吹走:

str.force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '')
Run Code Online (Sandbox Code Playgroud)

  • menu.to_s.encode('UTF-8',{:invalid =>:replace,:undef =>:replace,:replace =>'?'}) - >这个有效!:d (3认同)

gvo*_*gvo 8

您自动接受的解决方案不起作用,实际上没有错误,但它不是JSON.

我使用oj gem解决了这个问题,它现在可以找到了.它也比标准JSON库快.

写作:

   menu_json = Oj.dump menu
Run Code Online (Sandbox Code Playgroud)

读 :

   menu2 = Oj.load menu_json
Run Code Online (Sandbox Code Playgroud)

https://github.com/ohler55/oj了解更多详情.我希望它会有所帮助.