Ruby:如何生成具有Excel友好编码的CSV文件
我正在生成CSV文件,生成后需要在Excel中打开和查看这些文件。似乎Excel需要与UTF-8不同的编码 以下是我的配置和生成代码: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_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")