2011-01-19 15 views
5

simplemente llegué al azar este extraño error a través de los carriles 3, en heroku (postgres)Rails 3, heroku - PGError: ERROR: secuencia de bytes no válidos para la codificación "UTF-8":

PGError: ERROR: invalid byte sequence for encoding "UTF8": 0x85 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". : INSERT INTO "comments" ("content") VALUES ('BTW∑I re-listened to the video' ...... 

la indirecta aunque bonita ISN' t haciendo que cualquier cosa haga clic para mí. ¿Puedo configurar la codificación en algún lugar? ¿Debo incluso meterme con eso? ¿Alguien ha visto esto y/o tiene alguna idea sobre cómo lidiar con este tipo de problema?

Gracias

Respuesta

6

De lo que he entendido, este es un problema en el que la cadena que se está tratando de insertar en su servidor PostgrSQL no está codificado con UTF-8. Esto es algo extraño, porque su aplicación Rails debe estar configurada para usar UTF-8 de forma predeterminada.

Hay un par de maneras que usted puede intentar solucionar este problema (en el orden de lo que recomiendo):

  • En primer lugar, asegúrese de que config.encoding se establece en "utf-8" en config/application.rb.

  • Si está utilizando Ruby 1.9, puede intentar forzar la codificación de caracteres antes de la inserción con toutf8.

  • Puede averiguar con qué está codificada su cadena, y establecer manualmente SET CLIENT_ENCODING TO 'ISO-8859-1'; (o la que sea la codificación) en su conexión PostgeSQL antes de insertar la cadena. No olvides hacer RESET CLIENT_ENCODING; después de la declaración para restablecer la codificación.

  • Si está usando Ruby 1.8 (que es más probable), puede usar la biblioteca iconv para convertir la cadena a UTF-8. Consulte la documentación here.

  • Una solución más hackish es anular sus getters y setters en el modelo (es decir, content y content=) codificar y decodificar su cadena con Base64. Se vería algo como esto:

 

require 'base64' 

class Comment 
    def content 
    Base64::decode64(self[:content]) 
    end 

    def content=(value) 
    self[:content] = Base64::encode64(value) 
    end 
end 
+0

Gracias vonconrad, eres un salvavidas. Tengo config.ecoding configurado correctamente. Aunque quizás Heroku está cambiando algo en la implementación. Si voy con la solución iconv, que parece ser la elección más inteligente de su comentario, ¿se han producido problemas al pasar a Ruby 1.9? Además, el documento está bastante vacío para iconv y soy un novato, ¿hay alguna manera de ver un ejemplo? ¡Gracias! – AnApprentice

+3

Creo que 'iconv' debería funcionar para 1.8 y 1.9. En cuanto al código, algo así debería funcionar: 'content = :: Iconv.conv ('UTF-8 // IGNORE', 'UTF-8', contenido + '') [0 ..- 2]'. Básicamente, esto obliga a la codificación a ser UTF-8, sin importar lo que era originalmente. Obtuve el código de aquí: http://stackoverflow.com/questions/4583924/string-force-encoding-in-ruby-1-8-7-or-rails-2-x/4585362#4585362 – vonconrad

Cuestiones relacionadas