ruby - Encoding::UndefinedConversionError
sinatra sequel (4)
¿Qué esperas de "/ xC2"? Probablemente un
Con ASCII-8BIT tienes datos binarios, y Ruby no puede decidir qué debería ser.
Primero debes configurar la codificación con force_encoding
.
Puedes probar el siguiente código:
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"
}
El resultado son los valores posibles en diferentes codificaciones para su "/ xC2".
El resultado puede depender de su formato de salida, pero creo que puede hacer una buena conjetura, qué codificación tiene.
Cuando definió la codificación que necesita (probablemente cp1251) puede
menu.force_encoding(''cp1252'').to_json
Véase también el comentario de Kashyaps.
Sigo recibiendo un Encoding::UndefinedConversionError - "/xC2" from ASCII-8BIT to UTF-8
cada vez que intento convertir un hash en una cadena JSON. Lo intenté con [.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ])
[.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ])
, encadenando .encode
con .force_encoding
, al revés, cambiando los parámetros pero nada pareció funcionar, así que detecté el error así:
begin
menu.to_json
rescue Encoding::UndefinedConversionError
puts $!.error_char.dump
p $!.error_char.encoding
end
Donde el menú es el conjunto de datos de una secuela.hasta con contenido de una base de datos MySQL, la codificación utf8_general_ci y devolvió esto:
"/ xC2"
<#Encodificación: ASCII-8BIT>
La codificación nunca cambia, no importa qué .encode
/ .force_encoding
use. Incluso he intentado reemplazar la cadena .gsub!(////xC2/)
sin suerte.
¿Algunas ideas?
Si no te importa perder los personajes extraños, puedes volarlos:
str.force_encoding("ASCII-8BIT").encode(''UTF-8'', undef: :replace, replace: '''')
Su solución aceptada automáticamente no funciona, efectivamente no hay errores, pero NO es JSON.
Resolví el problema usando la gema oj, ahora funciona encontrar. También es más rápido que la biblioteca estándar de JSON.
Escribiendo:
menu_json = Oj.dump menu
Leyendo :
menu2 = Oj.load menu_json
https://github.com/ohler55/oj para más detalles. Espero que te ayude.
menu.to_s.encode(''UTF-8'', invalid: :replace, undef: :replace, replace: ''?'')
Esto funcionó perfectamente, tuve que reemplazar algunos caracteres adicionales, pero no hay más errores.