Pregunta

He creado un WebAPI que los rendimientos JSON.

Los datos iniciales es como sigue (UTF-8 codificado):

@text="Rosenborg har ikke h\xC3\xB8rt hva Steffen"

A continuación, con un .to_json en mi objeto, esto es lo que se envía por el API (creo que es la codificación ISO-8859-1):

"text":"Rosenborg har ikke h\ufffd\ufffdrt hva Steffen"

Estoy usando HTTParty en el lado del cliente, y eso es lo que finalmente sale:

"text":"Rosenborg har ikke h��rt hva"

Tanto WebAPI y aplicación cliente están utilizando de Ruby 1.9.2 y los carriles 3.

Estoy un poco perdido con este tema codificación ... He intentado añadir la codificación UTF-8 cabecera a mis archivos de rubíes pero no cambió nada. Supongo que me falta una codificación / decodificación de parte alguna parte ... alguien tiene una idea?

Muchas gracias !!! Vicente

¿Fue útil?

Solución

En Ruby 1.9, la codificación es explícito ahora. Sin embargo, los carriles pueden o no pueden ser configurados para enviar las respuestas en la codificación de lo esperado. Vas a tener que poner el ajuste de configuración global:

Encoding.default_external = "utf-8".

Creo que la codificación que Ruby especifica por defecto para la serialización es el valor por defecto de la plataforma. En Estados Unidos en Windows que sería CodePage-1251. Otros países tendrían una codificación alternativa.

Editar : Véase también esta URL si el JSON se ejecuta en contra de MySQL: https://rails.lighthouseapp.com/projects/8994/tickets/5210-encoding-problem-in-json-format-response

Editar 2 : Carriles núcleo y su conjunto de bibliotecas (ActiveRecord, et al..) Respete el ajuste de configuración Encoding.default_external que codifica todos los valores que envía. Desafortunadamente, debido a la codificación es un concepto relativamente nuevo que Ruby no todas las bibliotecas tercera parte se ha ajustado para la codificación adecuada. Los que tienen pueden requerir ajustes de configuración adicionales para esas bibliotecas. Esto incluye MySQL, y la biblioteca RSolr que estaba utilizando.

En todas las versiones de Ruby antes de la serie 1.9, una cadena era sólo una matriz de bytes. Cuando usted ha estado pensando de esa manera durante tanto tiempo, es difícil de envolver su cabeza en torno al concepto de múltiples codificaciones de cadena. Lo que es aún más confuso ahora es que a diferencia de Java, C # y otros lenguajes que utilizan algún tipo de UTF como el formato de cadena nativa, Ruby permite que cada cadena a ser codificado de manera diferente. En retrospectiva, que podría ser un error, pero al menos ahora están respetando codificación.

El método Encoding.force_encoding está diseñado para tratar la secuencia de bytes con que la nueva codificación, pero no cambia cualquiera de los datos subyacentes. Por lo tanto, es posible tener secuencias de bytes no válidos. Hay otro método llamado .encode() que transformará los bytes de una codificación a otra y garantiza secuencias de bytes válidos. Para obtener más información, lea la siguiente:

http://blog.grayproductions.net/articles/ruby_19s_string

Otros consejos

Ok, finalmente descubrió lo que el problema es ...

Estoy usando RSolr para obtener mis datos de Solr, y mediante la codificación por defecto para todos los resultados es por desgracia 'US-ASCII' como se ha mencionado aquí (y comprobado por mí mismo): http://groups.google.com/group/rsolr/browse_thread/thread/ 2d4890fa7737e7ef #

Así que hay que forzar la codificación de la siguiente manera:

my_string.force_encoding(Encoding::UTF_8)

No es tal vez una buena opción de codificación para proporcionar a RSolr!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top