ruby encoding sinatra sequel

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.