【问题标题】:Character encoding issue exporting rails data to CSV将 Rails 数据导出到 CSV 的字符编码问题
【发布时间】:2012-03-27 04:54:48
【问题描述】:

我正在将数据导出到 rails 中的 CSV 文件,并且在我的某些字段中,当我在 Excel 中打开时遇到了类似这样的字符编码问题:

didn’t

我从一个例子中借用了这段代码,我假设编码是关闭的。知道它应该是什么吗?

send_data csv_data,
      :type => 'text/csv; charset=iso-8859-1; header=present',
      :disposition => "attachment; filename=#{filename}.csv"

【问题讨论】:

  • csv_data 是如何生成的? Rails 通常默认为 UTF-8,因此在第二行将其更改为 charset=utf-8; 可能就足够了。

标签: ruby-on-rails-3 character-encoding


【解决方案1】:

当 Excel 打开 CSV 文件时,它只假定“iso-8859-1”字符编码。我猜它甚至不知道您在 HTTP 回复中发送的编码信息。这就是为什么将其设置为 UTF-8 不起作用的原因。

因此,为了在 Rails 中为 Excel 导出 CSV 文件,您可以这样做:

send_data Iconv.conv('iso-8859-1//IGNORE', 'utf-8', csv_data),
  :type => 'text/csv; charset=iso-8859-1; header=present',
  :disposition => "attachment; filename=#{filename}.csv"

这会将您的 UTF-8 数据字符串(这是 Rails 的默认值)重新编码为 ISO-8859 并发送。随之而来的是该回复实际上是 ISO-8859-1 编码的信息(这不会对 Excel 产生影响,但如果您应该在浏览器等中打开它在技术上是正确的)。

【讨论】:

  • 使用 Ruby 1.9,您可以使用 String 类处理字符编码。也可以使用处置默认值。这导致更简单:send_data csv_string.encode("iso-8859-1"), :filename => fname, :type => 'text/csv; charset=iso-8859-1; header=present'
  • 在我的情况下,接受的答案不起作用(无法识别 Iconv 常量)。但是,上面评论中提出的解决方案效果很好。由于转换字符串编码的总体思路是正确的,因此我仍在对这个答案和评论进行投票。
  • Iconv 自 Ruby 1.9.3 起已弃用。但是,send_data csv_string.encode("iso-8859-1"), :filename => fname, :type => 'text/csv; charset=iso-8859-1; header=present' 对我不起作用。
【解决方案2】:

这对我有用,有中文字符!excel csv fromat (BOM + UTF8)

def export_csv_excel
  ....

  # Add BOM to make excel using utf8 to open csv file
  head = 'EF BB BF'.split(' ').map{|a|a.hex.chr}.join()

  csv_str = CSV.generate(csv = head) do |csv|
    csv << [ , , , ...]
    @invoices.each do |invoice|
      csv << [ , , , ...]
    end
  end

  send_data csv_str, filename: "Invoices-#{Time.now.strftime("%y%m%d%H%M%S")}.csv", type: "text/csv"
end

来源(中文):http://blog.inheart.tw/2013/09/rubyraisl-csv-excel.html

【讨论】:

  • 嗨,你能解释一下这是如何工作的,因为 CSV.generate(csv = head) 接受哈希? 'csv' 来自哪里?它还没有被定义?
  • 随 ruby​​ 一起提供。 ruby 1.9.3 csv
  • require 'csv' # 添加这个!
  • 它在没有 csv = 的情况下工作,只需 CSV.generate(head)
  • 更简洁:head = %w[EF BB BF].map { |a| a.hex.chr }.join
【解决方案3】:

上面的答案在 Mac Excel 上对我不起作用: 使用iso-8859-1 需要我替换/删除奇怪的字符,这对我来说不是一个足够好的解决方案,并且使用BOMUTF8 在Windows 下工作但在Mac Excel 下不行。

对我有用的是https://stackoverflow.com/a/20194266/226255 建议的WINDOWS-1252 编码

def self.to_csv(options = {})
  (CSV.generate(options) do |csv|
    csv << self.headers

    all.each do |e|
      csv << e.values
    end
   end).encode('WINDOWS-1252', :undef => :replace, :replace => '')
end

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多