2013-04-04 20 views
8

Questo è quello che stavo facendo:Rubino CSV UTF8 Errore di codifica durante la lettura

csv = CSV.open(file_name, "r") 

ho usato questo per la prova:

line = csv.shift 
while not line.nil? 
    puts line 
    line = csv.shift 
end 

E mi sono imbattuto in questo:

ArgumentError: invalid byte sequence in UTF-8 

Ho letto il answer here e questo è quello che ho provato

csv = CSV.open(file_name, "r", encoding: "windows-1251:utf-8") 

mi sono imbattuto nel seguente errore:

Encoding::UndefinedConversionError: "\x98" to UTF-8 in conversion from Windows-1251 to UTF-8 

Poi mi sono imbattuto in una gemma rubino - charlock_holmes. Ho pensato di provare a usarlo per trovare la codifica sorgente.

CharlockHolmes::EncodingDetector.detect(File.read(file_name)) 
=> {:type=>:text, :encoding=>"windows-1252", :confidence=>37, :language=>"fr"} 

Quindi ho fatto questo:

csv = CSV.open(file_name, "r", encoding: "windows-1252:utf-8") 

E ancora ottenuto questo:

Encoding::UndefinedConversionError: "\x8F" to UTF-8 in conversion from Windows-1252 to UTF-8 
+0

Sembra che [questo] [1] potrebbe funzionare. ---- [1]: http://stackoverflow.com/a/9361667/724516 – Vighnesh

+0

Potresti caricare il file csv? –

risposta

4

Sembra che tu hai problemi con il rilevamento della codifica valida del file. CharlockHolmes fornisce un utile suggerimento di :confidence=>37 che significa semplicemente che la codifica rilevata potrebbe non essere quella giusta.

Basando su messaggi di errore e test_transcode.rb da https://github.com/MacRuby/MacRuby/blob/master/test-mri/test/ruby/test_transcode.rb ho trovato la codifica che passa attraverso entrambi i messaggi di errore. Con l'aiuto di String#encode è facile prova:

"\x8F\x98".encode("UTF-8","cp1256") # => "ڈک" 

Il tuo problema sembra strettamente correlato al file e non al rubino.

Nel caso in cui non siamo sicuri che codifica da utilizzare e in grado di accettare di perdere qualche personaggio che possiamo usare :invalid e :undef params per String#encode, in questo caso:

"\x8F\x98".encode("UTF-8", "CP1250",:invalid => :replace, :undef => :replace, :replace => "?") # => "Ź?" 

altro modo è quello di utilizzare Iconv*//IGNORE opzione per la codifica di destinazione:

Iconv.iconv("UTF-8//IGNORE","CP1250", "\x8F\x98") 

Come suggerimento codifica fonte di CharlockHolmes dovrebbe essere abbastanza andare od.

PS. String.encode è stato introdotto nel rubino 1.9. Con ruby ​​1.8 è possibile utilizzare Iconv

+0

Grazie per la risposta. Sono abbastanza sicuro che il problema sia legato al mio file. Devo ancora essere in grado di analizzarlo però. Sto bene perdendo alcuni dei personaggi. Qualche idea? – Vighnesh

+0

@Vighnesh questo aggiornamento ha più senso? – chrmod

+0

ooh bello! questo sembra davvero utile Darò un colpo. Apprezzo i tuoi sforzi! – Vighnesh

Problemi correlati