Проблема кодировки символов при экспорте данных рельсов в CSV - PullRequest
13 голосов
/ 09 марта 2012

Я экспортирую данные в CSV-файл в рельсах, и в некоторых из моих полей возникают проблемы с кодировкой символов, подобные этой, когда я открываю в Excel:

didn’t

Я позаимствовал этот код из примера и предположил, что кодировка выключена. Есть идеи, что это должно быть?

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

Ответы [ 4 ]

18 голосов
/ 12 июля 2012

Когда Excel открывает файл CSV, он принимает только кодировку iso-8859-1. Я предполагаю, что он даже не знает о кодирующей информации, которую вы отправляете в своем HTTP-ответе. Вот почему установка этого значения в UTF-8 не работает.

Итак, чтобы экспортировать файл CSV для Excel в Rails, вы можете сделать это:

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, но технически правильно, если вы откроете его в браузере и т.

11 голосов
/ 30 октября 2013

Это сработало для меня с китайскими иероглифами! 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

6 голосов
/ 21 мая 2014

Ответы выше не работали для меня в Mac Excel: Использование iso-8859-1 потребует замены / удаления странных символов, что для меня недостаточно, а использование BOM с UTF8 работает под Windows, но не под Mac Excel.

Что сработало для меня, так это кодировка WINDOWS-1252, предложенная https://stackoverflow.com/a/20194266/226255

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
0 голосов
/ 22 марта 2018

Это мой подход с использованием I18n.transliterate:

def self.to_csv(options = {})
  csv = CSV.generate(options) do |csv|
    csv << your_attributes
  end
  I18n.transliterate(csv)
end

I18n.transliterate просто удаляет странные символы и пытается сделать их читаемыми (например, он заменит á на a, ö на o и т. Д.). Просто попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...