Проблема кодирования символов: экспорт данных рельсов в CSV

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

didn’t

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

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

Ответ 1

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

Ответ 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

Ответ 3

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

Для меня работала кодировка WINDOWS-1252, предложенная fooobar.com/info/42104/...

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