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)
这完美地工作,我不得不更换一些额外的字符,但没有更多的错误.
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)
您自动接受的解决方案不起作用,实际上没有错误,但它不是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了解更多详情.我希望它会有所帮助.
| 归档时间: |
|
| 查看次数: |
39353 次 |
| 最近记录: |