Ruby on rails 3 字符编码问题将rails数据导出到CSV

Ruby on rails 3 字符编码问题将rails数据导出到CSV,ruby-on-rails-3,character-encoding,Ruby On Rails 3,Character Encoding,我在rails中将数据导出到CSV文件,在我的一些字段中,当我在Excel中打开时,会遇到如下字符编码问题: didn’t 我从一个例子中借用了这段代码,我假设编码是关闭的。知道应该是什么吗 send_data csv_data, :type => 'text/csv; charset=iso-8859-1; header=present', :disposition => "attachment; filename=#{filename}.csv"

我在rails中将数据导出到CSV文件,在我的一些字段中,当我在Excel中打开时,会遇到如下字符编码问题:

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

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

当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来说没有什么区别,但是如果你在浏览器中打开它,技术上是正确的。)

这对我来说很有效,使用了中文字符!excel csv格式(BOM+UTF8)

def导出\u csv\u excel
....
#添加BOM以使用utf8创建excel以打开csv文件
head='EF-BB-BF'.split('').map{a | a.hex.chr}.join()
csv_str=csv.generate(csv=head)do | csv|

csv以上答案在Mac Excel上对我无效: 使用
iso-8859-1
需要替换/删除奇怪的字符,这对我来说不是一个好的解决方案,使用
BOM
UTF8
在Windows下工作,但在Mac Excel下不工作

对我有效的是WINDOWS-1252的

def self.to_csv(选项={})
(CSV.generate(options)do | CSV|
csv“”)
结束

如何生成
csv\u数据?Rails通常默认为UTF-8,因此将其更改为
charset=UTF-8就足够了在第二行。使用Ruby 1.9,您可以使用String类处理字符编码。也可以使用处置默认值。这导致了更简单的:
send_data csv_string.encode(“iso-8859-1”),:filename=>fname,:type=>text/csv;字符集=iso-8859-1;header=present'
在我的情况下,接受的答案不起作用(Iconv常量未识别)。然而,上述评论中提出的解决方案效果良好。我仍然对这个答案和评论投赞成票,因为转换字符串编码的总体想法是正确的。
Iconv
在Ruby 1.9.3中被弃用。但是,
send_data csv_string.encode(“iso-8859-1”),:filename=>fname,:type=>'text/csv;字符集=iso-8859-1;header=present'
对我不起作用。您好,您能解释一下当CSV.generate(CSV=head)接受散列时这是如何工作的吗?“csv”从何而来?它还没有被定义?随ruby一起发布。需要“csv”#添加此项!它没有
csv=
just
csv.generate(head)
更简洁:
head=%w[EF BB BF].map{a | a.hex.chr}.join
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
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