将rails数据导出为CSV的字符编码问题

Sli*_*k23 13 character-encoding ruby-on-rails-3

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

didn’t
Run Code Online (Sandbox Code Playgroud)

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

send_data csv_data,
      :type => 'text/csv; charset=iso-8859-1; header=present',
      :disposition => "attachment; filename=#{filename}.csv"
Run Code Online (Sandbox Code Playgroud)

bas*_*s-t 18

当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"
Run Code Online (Sandbox Code Playgroud)

这会将您的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; 字符集= ISO-8859-1; 标题= present'` (14认同)
  • 从 Ruby 1.9.3 开始,“Iconv”已被弃用。但是, `send_data csv_string.encode("iso-8859-1"), :filename => fname, :type => 'text/csv; 字符集=iso-8859-1;header=present'` 对我不起作用。 (2认同)

小智 11

这对我有用,有中文字符!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
Run Code Online (Sandbox Code Playgroud)

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


Abd*_*bdo 7

这些问题的答案上面并没有在Mac的Excel工作对我来说:使用iso-8859-1需要更换我/删除奇怪的字符,这是不是对我来说是足够好的解决方案,并且使用BOMUTF8在Mac的Excel Windows下,但没有奏效.

对我WINDOWS-1252有用的是/sf/answers/1413598651/建议的编码

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
Run Code Online (Sandbox Code Playgroud)