当我尝试将U+2014 from UTF-8 to ISO-8859-1
与具有西班牙语字符的CSV一起使用时,我收到错误send_data
:
模型:
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 ===
我认为我将.encode
替换为.force_encoding
来解决问题。但是,我现在有很多看起来不正确的角色:
例如:该文件包含:
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 :(得分:1)
String#force_encoding
,因为它只是使用不同的编码“标记”字符串,而#encode
会进行实际转换。
您收到此错误的原因是因为,data
中的某个地方有一个字符:“ - ”。正如String#encode
文档所述:
针对目标编码中未定义的字符引发Encoding :: UndefinedConversionError [...]
如果你检查iso map(http://en.wikipedia.org/wiki/ISO/IEC_8859-1),就没有“ - ”
人物在8859-1。因此,要解决此问题,您需要从data
中删除这些“无效”字符。
除此之外,除非有某些特定原因,否则应避免此类转换,并让CSV以utf-8编码生成。