2012-10-04 16 views
5

Sto ottenendo il seguente errore:errore di codifica con Rails, PostgreSQL e caratteri non standard

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

database è PostgreSQL 9.0.6 su un app Heroku.

Non so come aggirare quell'errore quando ci sono caratteri dispari.

risposta

8

Il database non è impostato sullo stesso schema di codifica della stringa che si sta tentando di inserire. Immagino che Postgres su Heroku sia impostato per usare UTF-8 di default e il tuo input potrebbe essere una delle varianti latine se dovessi indovinare. È possibile impostare il database per accettare lo schema di codifica che si intende inserire, ad esempio:

SET CLIENT_ENCODING 'ISO-8859-2' 

Oppure si può convertire il vostro input in UTF-8 (questo è probabilmente meglio)

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

E 'probabile il tuo database non è impostato sulla stessa codifica della stringa che stai inserendo. Postgres è in genere UTF-8. Dovrai impostare la codifica corretta sulla tua stringa.
Questo potrebbe essere semplice come

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

O se la stringa è codificati in modo errato si può anche avere a force_encoding prima. vale a dire. è memorizzato come 'Windows-1252' ma non è contrassegnato come tale da Ruby.

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

Abbiamo avuto questo problema a lavorare con SendGrid + Heroku Rails http://blog.zenlike.me/2013/04/06/sendgrid-parse-incoming-email-encoding-errors-for-rails-apps-using-postgresql/

+0

La force_encoding era l'ingrediente magico di cui avevo bisogno per correggere l'errore. Stavo anche usando Sendgrid + Heroku Rails, in particolare usando la loro funzione Parse per le e-mail in arrivo (sul loro: testo e: parametri html) – LikeMaBell

+0

Mi hai salvato la vita ... –

0

Questo sembra funzionare per me:

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

Il primo argomento è la codifica che si desidera che la stringa da in e il secondo argomento è la codifica secondo la quale la stringa è in.

String#encode

Esistono anche opzioni nella documentazione su come gestire caratteri non validi o non definiti.

Questo è quello che ho finito per usare (giusto per essere sicuri):

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

Si può anche fare un metodo di supporto:

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

Il problema che stavo avendo stava caricando i dati da l'API Amazon Merchant Services.

Problemi correlati