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。