2015-04-21 4 views
9

Durante l'esportazione csv in Rails 4.2 app, ci sono codice ASCII nell'output CSV per i caratteri cinesi (UTF8):Rails 4.2 - come risolvere il codice ASCII nell'esportazione CSV senza gem 'iconv'?

中åˆåŒç†Šå·¥ç­‰ç”¨é¤ 

Abbiamo cercato opzioni in send_data senza fortuna:

send_data @payment_requests.to_csv, :type => 'text/csv; charset=utf-8; header=present' 

E:

send_data @payment_requests.to_csv.force_encoding("UTF-8") 

Nel modello, si è costretti utf8 codifica:

# encoding: utf-8 

Ma non funziona. Ci sono post online che parlano dell'uso della gemma iconv. Tuttavia, iconv dipende dalla versione rubino della piattaforma. C'è una soluzione più pulita per risolvere l'ascii nell'esportazione di csv Rails 4.2?

+0

http://stackoverflow.com/a/8873922/525478 –

+0

Qual è la codifica effettivo dei dati? –

+0

'@ FrederickCheung', credo che sia utf8 come predefinito di Rails 4. Esiste un metodo di esportazione simile utilizzato nell'app Rails 3 e i caratteri cinesi sono stati visualizzati correttamente. – user938363

risposta

1

Si può provare:

@payment_requests.to_csv.force_encoding("ISO-8859-1") 
+0

Nessuna fortuna. anche se è pulito. – user938363

+0

caratteri cinesi? Forse hai bisogno di usare UTF-8 invece di ISO-8859-1. – dx7

+0

provato .force_encoding ("UTF-8") senza fortuna. – user938363

6

Se @payment_requests.to_csv include testo ASCII, quindi si dovrebbe utilizzare encode metodo:

@payment_requests.to_csv.encode("UTF-8") 

o

@payment_requests.to_csv.force_encoding("ASCII").encode("UTF-8") 

a seconda di quale codifica interna @payment_requests.to_csv ha .

1

per i caratteri cinesi

CSV.generate(options) do |csv| 
    csv << column_names 
    all.each do |product| 
    csv << product.attributes.values_at(*column_names) 
    end 
end.encode('gb2312', :invalid => :replace, :undef => :replace, :replace => "?") 
0

Questo è ciò che ha funzionato per me:

head = 'EF BB BF'.split(' ').map{|a|a.hex.chr}.join() 

csv_str = CSV.generate(csv = head) do |csv| 
    csv << [ , , , ...] 
    @elements.each do |element| 
    csv << [ , , , ...] 
    end 
end