将Ruby CSV文件编码为UTF-8,但Windows Excel无法识别

4
在Ruby中,我正在生成CSV文件,打开文件时,我将其指定为UTF-8编码。以下是代码。在Linux和Mac上运行良好,但在Windows上尝试打开CSV文件时,Excel无法识别为UTF-8。我该怎么做才能让Windows将其识别为UTF-8编码? CSV.open(File.join(Rails.public_path,"/csv_uploads/#{csv_name}.csv"), "w:UTF-8")
我甚至手动将文件中的项目编码为UTF-8。
`result[2].encode('UTF-8')`.

生成的文件开头是否也有BOM(字节顺序标记)?当它存在时,Windows应用程序通常能更好地工作。 - dsz
是的,我尝试添加了CSV.open(File.join(Rails.public_path,"/csv_uploads/#{csv_name}.csv"), "w:bom|UTF-8"),但没有成功。 - Rupa Das
很有趣,自从两三天前我的应用程序出现了同样的问题......尽管在那之前它一直都能正常工作。 - Lucian Tarna
我也尝试过添加 BOM,并且指定了 w:utf-8,但是 Windows 仍然无法识别它。 - Lucian Tarna
您可以参考此链接 https://medium.com/praaveen/rails-csv-generation-with-i18n-content-to-support-linux-ubuntu-mac-and-windows-27ecb2334cc0,了解如何使用i18n内容生成支持Linux、Ubuntu、Mac和Windows的Rails CSV。 - praaveen V R
1个回答

1

在编写时需要使用open_mode和bom。

这里需要注意的重要事项是open_mode和bom

open_mode = "w+:UTF-16LE:UTF-8"

bom = "\xEF\xBB\xBF"

在编写CSV之前插入BOM

f.write bom

f.write(csv_file)

示例I18n内容

在Mac和Linux中

瑞典语:Förnamn 英语:名字

在Windows中

瑞典语:Förnamn 英语:名字

示例代码:

def user_information_report(report_file_path, user_id)
    user = User.find(user_id)
    I18n.locale = user.current_lang
    open_mode = "w+:UTF-16LE:UTF-8"
    bom = "\xEF\xBB\xBF"
    body user, open_mode, bom
  end

def headers
    headers = [
        "ID", "SDN ID",
        I18n.t('sys_first_name'), I18n.t('sys_last_name'), I18n.t('sys_dob'),
        I18n.t('sys_gender'), I18n.t('sys_email'), I18n.t('sys_address'),
        I18n.t('sys_city'), I18n.t('sys_state'), I18n.t('sys_zip'),
        I18n.t('sys_phone_number')
    ]
  end

def body tenant, open_mode, bom
    File.open(report_file_path, open_mode) do |f|
      csv_file = CSV.generate(col_sep: "\t") do |csv|
        csv << headers
        tenant.patients.find_each(batch_size: 10) do |patient|
          csv <<  [
              patient.id, patient.patientid,
              patient.first_name, patient.last_name, "#{patient.dob}",
              "#{translate_gender(patient.gender)}", patient.email, "#{patient.address_1.to_s} #{patient.address_2.to_s}",
              "#{patient.city}", "#{patient.state}",  "#{patient.zip}",
              "#{patient.phone_number}"
          ]
        end
      end
      f.write bom
      f.write(csv_file)
    end
  end

Windows和Mac

文件可以直接双击打开。

Linux(Ubuntu)

在打开文件时会询问分隔符选项 -> 选择“TAB”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接