2012-10-04 33 views
5

que estoy recibiendo el siguiente error:error de codificación con rieles, PostgreSQL y caracteres no estándar

ActiveRecord::StatementInvalid: PG::Error: ERROR: invalid byte sequence for encoding "UTF8": 0xf66e6bf6 : INSERT INTO "response_sets" ("city") VALUES ('Jönköping') RETURNING "id" 

base de datos es PostgreSQL 9.0.6 en una aplicación Heroku.

No estoy seguro de cómo evitar ese error cuando hay caracteres impares.

Respuesta

8

Su base de datos no está configurada con el mismo esquema de codificación que la cadena que está tratando de insertar. Me imagino que Postgres en Heroku está configurado para usar UTF-8 por defecto y tu entrada podría ser una de las variaciones latinas si tuviera que adivinar. Puede configurar su base de datos para aceptar el esquema de codificación que está suministrando, por ejemplo:

SET CLIENT_ENCODING 'ISO-8859-2' 

O puede transcodificar el de entrada a UTF-8 (esto es probablemente mejor)

"my string".encode('UTF-8') 
4

lo más probable su base de datos no está configurada con la misma codificación que la cadena que está insertando. Postgres es típicamente UTF-8. Tendrá que establecer la codificación correcta en su cadena.
que podría ser tan simple como

"string".encode('UTF-8') 

O si la cadena está etiquetado incorrectamente también puede tener que force_encoding primero. es decir. está almacenado como 'Windows-1252' pero no marcado como tal por Ruby.

"string".force_encoding('Windows-1252').encode('UTF-8') 

Hemos tenido este problema trabajando con rieles SendGrid + Heroku http://blog.zenlike.me/2013/04/06/sendgrid-parse-incoming-email-encoding-errors-for-rails-apps-using-postgresql/

+0

Force_encoding fue el ingrediente mágico que necesitaba para corregir el error. También estaba usando Sendgrid + Heroku Rails, específicamente usando su función Parse para los correos electrónicos entrantes (en sus parámetros: text y: html) – LikeMaBell

+0

Me salvaste la vida ... –

0

Esto parece funcionar para mí:

"Hern\xE1ndez".encode('UTF-8','ISO-8859-1') 

El primer argumento es la codificación que desea que la cadena que se va y el segundo argumento es la codificación en la que crees que está la cadena.

String#encode

También hay opciones en la documentación sobre cómo tratar los caracteres no válidos o indefinidos.

Esto es lo que terminé usando (sólo para estar seguro):

"Hern\xE1ndez".encode('UTF-8','ISO-8859-1', :invalid => :replace, :undef => :replace, :replace => "?") 

También puede compensar un método de ayuda:

def convert_to_utf_8(string) 
    string.encode('UTF-8','ISO-8859-1', :invalid => :replace, :undef => :replace, :replace => "?") 
end 

El problema que tenía estaba cargando los datos de la API de Amazon Merchant Services.

Cuestiones relacionadas