user938363
user938363

Reputation: 10360

Rails 4.2 - how to fix ascii code in CSV exporting without gem 'iconv'?

When exporting csv in Rails 4.2 app, there are ascii code in the csv output for Chinese characters (UTF8):

中åˆåŒç†Šå·¥ç­‰ç”¨é¤

We tried options in send_data without luck:

send_data @payment_requests.to_csv, :type => 'text/csv; charset=utf-8; header=present'

And:

send_data @payment_requests.to_csv.force_encoding("UTF-8")

In model, there is forced encoding utf8:

# encoding: utf-8

But it does not work. There are online posts talking about use gem iconv. However iconv depends on the platform's ruby version. Is there cleaner solution to fix the ascii in Rails 4.2 csv exporting?

Upvotes: 9

Views: 2986

Answers (4)

Kryptman
Kryptman

Reputation: 1016

This is what worked for me:

head = 'EF BB BF'.split(' ').map{|a|a.hex.chr}.join()

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

Upvotes: 0

Lei Wang
Lei Wang

Reputation: 562

for Chinese characters

CSV.generate(options) do |csv|
  csv << column_names
  all.each do |product|
    csv << product.attributes.values_at(*column_names)
  end
end.encode('gb2312', :invalid => :replace, :undef => :replace, :replace => "?")

Upvotes: 1

Dieter Pisarewski
Dieter Pisarewski

Reputation: 879

If @payment_requests.to_csv includes ASCII text, then you should use encode method:

@payment_requests.to_csv.encode("UTF-8")

or

@payment_requests.to_csv.force_encoding("ASCII").encode("UTF-8")

depending on which internal encoding @payment_requests.to_csv has.

Upvotes: 6

dx7
dx7

Reputation: 812

You can try:

@payment_requests.to_csv.force_encoding("ISO-8859-1")

Upvotes: 1

Related Questions