I keep getting an Encoding::UndefinedConversionError - "\xC2" from ASCII-8BIT to UTF-8
every time I try to convert a hash into a JSON string. I tried with [.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ])
, chaining .encode
with .force_encoding
, backwards, switching parameters but nothing seemed to work so I caught the error like this:
begin
menu.to_json
rescue Encoding::UndefinedConversionError
puts $!.error_char.dump
p $!.error_char.encoding
end
Where menu is a sequel's dataset.to_hash with content from a MySQL DB, utf8_general_ci encoding and returned this:
"\xC2"
<#Encoding:ASCII-8BIT>
The encoding never changes, no matter what .encode
/.force_encoding
I use. I've even tried to replace the string .gsub!(/\\\xC2/)
without luck.
Any ideas?
If you don't care about losing the strange characters, you can blow them away:
This worked perfectly, I had to replace some extra characters but there are no more errors.
What do you expect for "\xC2"? Probably a
Â
With ASCII-8BIT you have binary data, and ruby cant decide, what should be.
You must first set the encoding with
force_encoding
.You may try the following code:
The result are the possible values in different encodings for your "\xC2".
The result may depend on your Output format, but I think you can make a good guess, which encoding you have.
When you defined the encoding you need (probably cp1251) you can
See also Kashyaps comment.
Your auto-accepted solution doesn't work, there are effectively no errors, but it is NOT JSON.
I solved the problem using the oj gem, it now works find. It is also faster than the standard JSON library.
Writting :
Reading :
https://github.com/ohler55/oj for more details. I hope it will help.