Ruby CSV +西班牙语字符:Encoding :: UndefinedConversionError

时间:2014-01-08 22:33:20

标签: ruby csv

当我尝试将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á

1 个答案:

答案 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编码生成。

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