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

Ruby:如何生成具有Excel友好编码的CSV文件,ruby,excel,csv,encoding,export-to-csv,Ruby,Excel,Csv,Encoding,Export To Csv,我正在生成CSV文件,生成后需要在Excel中打开和查看这些文件。似乎Excel需要与UTF-8不同的编码 以下是我的配置和生成代码: csv_config = {col_sep: ";", row_sep: "\n", encoding: Encoding::UTF_8 } csv_string = CSV.generate(csv_config) do |csv| csv << ["Tex

我正在生成CSV文件,生成后需要在Excel中打开和查看这些文件。似乎Excel需要与UTF-8不同的编码

以下是我的配置和生成代码:

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

您知道如何确保正确编码吗?

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

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

CSV.generate(encoding:'ISO-8859-1'){| CSV | CSV来自@joaofraga的得票最高的答案对我有效,但我发现另一种解决方案也有效-不需要UTF-8到ISO-8859-1转码

据我所知,Excel确实可以处理UTF-8,但由于某些原因,它在默认情况下无法识别它。但是如果您在CSV数据的开头添加BOM,这似乎会使Excel意识到该文件是UTF-8

因此,如果您有这样的CSV:

csv_string = CSV.generate(csv_config) do |csv|
  csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"]
end
在我的例子中,我的控制器将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。

config={
config = {

  encoding: 'ISO-8859-1'
}

CSV.generate(config) { |csv|  csv << ["Text á", "Text é", "Text æ"] }
编码:“ISO-8859-1” }
CSV.generate(config){| CSV | CSVExcel理解UTF-8 CSV,如果它有BOM。这可以通过如下方式完成:

使用CSV.generate
#CSV.generate的参数是默认字符串
csv_string=csv.generate(“\uFEFF”)do|csv|
csv对于,我必须:

在控制器操作中:

@output_encoding = 'UTF-8'
send_data "\uFEFF" + render_to_string(), type: :csv, filename: @filename
csv.csvbuilder
模板顶部:

faster_csv.to_io.write("\uFEFF")

我不知道为什么我必须添加两次BOM表,但这两个BOM表都不能单独使用。

尝试将
#编码:UTF-8
作为Ruby文件的第一行(第二行,如果您有一个hash bang行,
#!/usr/bin/env Ruby
)。我相信您是用UTF-8编写的,但Ruby源文件被认为是用US ASCII编码的。(对于Ruby 2.0+,源代码默认为UTF-8)我使用的是
Ruby 2.0.0p247(2013-06-27修订版41674)[x86_64-darwin12.4.0]
所以我想这意味着我的安装已经默认为UTF-8。没有Ruby方面的经验。但是Excel可以打开以分号分隔的CSV文件,这些文件是UTF-8编码的。但是文件的开头必须有一个BOM表。分号是否可以用作分隔符取决于区域设置。所以最好的方法是使用制表符delimited CSV和那个些UTF-16LE编码的。这应该是最独立于区域设置的。你们在使用什么Excel?我在Excel 2013中显示特殊字符方面没有问题。另一个提示:使用它可以轻松地直接创建xlsx文件。上面的答案对我有效,但只有在我删除
列sep
行sep
参数之后我只需要
编码:'ISO-8859-1'
就足够了。对于上下文,我遇到的具体问题是
字符显示为
é很好的捕获格雷格,我将在没有上下文的情况下更新示例。是的,当然,8859-1适合所有东西耶,尝试在CSV文件中编写一些日语或阿拉伯语字符,如那.OP特别要求UTF-8,那么为什么要建议他回到几十年前呢?你想用一些解释来补充你的答案吗?OP特别要求UTF-8,而不是8859-1又名Ansithank。CSV.open解决方案对我来说非常有效!比其他答案稍微干净一点。#谢谢你也告诉我如何使用CSV.openTh即使我在excel online上打开时,它也适用于我,谢谢!不要像我一样困惑,旧的excel不起作用(2010年及以上)
config = {

  encoding: 'ISO-8859-1'
}

CSV.generate(config) { |csv|  csv << ["Text á", "Text é", "Text æ"] }
# the argument of CSV.generate is default string
csv_string = CSV.generate("\uFEFF") do |csv|
  csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"]
end
filename = "/tmp/example.csv"

# Default output encoding is UTF-8
CSV.open(filename, "w") do |csv|
  csv.to_io.write "\uFEFF" # use CSV#to_io to write BOM directly 
  csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"]
end
@output_encoding = 'UTF-8'
send_data "\uFEFF" + render_to_string(), type: :csv, filename: @filename
faster_csv.to_io.write("\uFEFF")