2014-01-08 43 views
1

我得到一個錯誤U+2014 from UTF-8 to ISO-8859-1當我嘗試使用send_data一個CSV有西班牙字符:紅寶石CSV +西班牙語特點:編碼:: UndefinedConversionError

型號:

def self.books_data(books) 
    csv = CSV.generate(:col_sep => "|", quote_char: '"') do |csv| 
    ... 
    end 
    csv 
end 

控制器:

def export_data 
    ... 
    data = CsvGenerator.books_data(@books) 
    send_data(data.encode("iso-8859-1"), filename: "books_data_#{date}.csv", type: 'text/csv; charset=iso-8859-1; header=present') #<-- error occurs here 
end 

我該如何解決這個問題?

=== UPDATE ===

我想用.force_encoding更換.encode我半固定它。不過,我現在有很多字符看起來不正確的:

例如:該文件包含: My Diary from Here to There/Mi diario de aqui hasta allá

時,它應該看起來像

My Diary from Here to There/Mi diario de aqui hasta allá

+0

你可以嘗試'SEND_DATA(data.encode( 「ISO-8859-1」),文件名: 「books_data _#{日期和時間}的.csv」,輸入:「文本/ CSV;字符集=異8859-1; header = present',{:invalid =>:replace,:undef =>:replace,:replace =>'?'})' – zrl3dx

+0

它表示語法錯誤。我認爲這是圍繞無效的{}'括起來的。我刪除了它們,並再次嘗試,但沒有語法錯誤,但是當我嘗試生成文件時,錯誤仍然出現 – Edmund

+0

Hey @ zrl3dx我半固定它。對第二個問題有什麼建議? – Edmund

回答

1

String#force_encoding不應該因爲它只是用不同的編碼「標記」字符串,而#encode並沒有實際的轉換。

您之所以會出現此錯誤,是因爲您的data中某處出現了\ u2014字符:「 - 」。由於String#encode文檔狀態:

提高編碼:: UndefinedConversionError對於那些在目標編碼字符不確定[...]

如果你檢查ISO地圖(http://en.wikipedia.org/wiki/ISO/IEC_8859-1),有no「 - 」 8859-1中的字符。所以要解決這個問題,你需要從data中刪除那些「無效」字符。

除此之外,除非有某些具體原因,否則應該避免這種轉換,並且讓CSV以UTF-8編碼生成。

http://railscasts.com/episodes/362-exporting-csv-and-excel