2012-12-11 10 views
13

Quando eseguo rake test, ottengo linea di errore ogni volta.rake test ed errore: scrittura del log fallita. " XE2" da ASCII-8BIT a UTF-8

log writing failed. "\xE2" from ASCII-8BIT to UTF-8 

Si prega di guida su questo. Come rimuovere questo errore.

+0

Hmm, che cosa sta eseguendo che scrittura di registro nel backtrace? Penso che la prima domanda sia determinare se il valore "\ xE2" viene creato in memoria dal codice, persistito e interrogato dal database, oppure creato dal framework. –

risposta

16

probabilmente avete da qualche parte nel codice cercando di stringa di uscita la cui codifica è sbagliato o ha alcuni caratteri strani e la codifica non funziona.

modo corretto sarebbe quello di trovare la stringa che si traduce in problemi e scoprire perché la sua in codifica sbagliata. Vedi codifica e force_encoding in string api (http://ruby-doc.org/core-2.2.0/String.html).

Se si desidera solo essere in grado di stampare quella linea nel registro ed evitare l'errore che si può fare la seguente procedura con quella stringa.

str = 'here is some string with wrong encoding and funny characters e.g. "\xE2"' 
# note if you do this in console, the str is encoded correctly 

# Rails.logger.info(str) # this would result in the error line 

# This will change the encoding and remove weird characters 
str = str.encode('utf-8', :invalid => :replace, :undef => :replace, :replace => '_') 

Rails.logger.info(str) # this now works 
+0

Il collegamento Rubydoc è 404. – ablarg

+0

@holli, il primo compito 'str' non è corretto. Dal momento che utilizzi virgolette singole per la costruzione di stringhe, '\ x' non viene rispettato. Il vostro esempio ha bisogno di essere aggiornata per essere: 'str = "qui è una certa stringa con codifica sbagliata e personaggi divertenti per esempio \ XE2"' e in questo modo, è possibile riprodurre correttamente il problema nella console Rails. Quando uso le doppie virgolette per l'assegnazione, e non chiamo '.encode', ora posso riprodurre correttamente l'errore, che per me è simile a questo:' ArgumentError: sequenza di byte non valida in UTF-8'. – stwr667

4

Stai utilizzando postgresql? Il tuo database potrebbe utilizzare SQL_ASCII. È possibile verificare se è in esecuzione psql template1 -c 'show server_encoding' Eliminare il cluster di database e reinizializzarlo con initdb -E utf8 /path/to/database.

+0

poiché questo è probabilmente Rails non dimenticare che puoi accedere al tuo database direttamente con rails db e quindi semplicemente digitando 'show server_encoding; le citazioni di sans ovviamente. – engineerDave

1

Nel mio caso alcuni virgolette strani erano il colpevole quindi ho solo li ha sostituiti con i caratteri sicuri come questo,

msg = error.message.gsub(/[“”]/, "\"").gsub(/[‘’]/,"\'") 
Problemi correlati