Ruby:如何生成具有Excel友好编码的CSV文件

我生成的CSV文件需要在Excel中打开并审阅。 看来,Excel需要与UTF-8不同的编码。

这是我的configuration和代码:

csv_config = {col_sep: ";", row_sep: "\n", encoding: Encoding::UTF_8 } csv_string = CSV.generate(csv_config) do |csv| csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] end 

在Excel中打开时,特殊字符不能正确显示:

 Text a Text b Text æ Text ø Text å 

任何想法如何确保正确的编码?

您应该将编码转换为ISO-8859-1 ,如下所示:

 CSV.generate(encoding: 'ISO-8859-1') { |csv| csv << ["Text á", "Text é", "Text æ"] } 

对于你的情况,你可以这样做:

 config = { col_sep: ';', row_sep: ';', encoding: 'ISO-8859-1' } CSV.generate(config) { |csv| csv << ["Text á", "Text é", "Text æ"] } 

我有同样的问题,编码固定。

来自@joaofraga的顶级投票答案为我工作,但我发现了另一种解决scheme,也工作 – 没有UTF – 8 ISO-8859-1转码所需。

从我读过的Excel中,确实可以处理UTF-8,但出于某种原因,默认情况下它不能识别它。 但是,如果您将一个BOM添加到CSV数据的开头 ,这似乎导致Excel意识到该文件是UTF-8。

所以,如果你有这样的CSV:

 csv_string = CSV.generate(csv_config) do |csv| csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] end 

就像这样添加一个BOM字节:

 "\uFEFF" + csv_string 

在我的情况下,我的控制器发送CSV文件,所以这是我的控制器看起来像:

 def show respond_to do |format| format.csv do # add BOM to force Excel to realise this file is encoded in UTF-8, so it respects special characters send_data "\uFEFF" + csv_string, type: :csv, filename: "csv.csv" end end end 

我应该注意到,UTF-8本身并不需要或推荐BOM ,但正如我所提到的,在这种情况下添加它似乎促使Excel意识到文件确实是UTF-8。