2012-03-09 48 views
11

我將數據導出到一個CSV文件中軌和我的一些領域,我越來越喜歡這個字符編碼問題,當我在Excel中打開:字符編碼問題鋼軌出口數據CSV

didn’t 

我從一個例子中借用了這段代碼,我假設編碼是關閉的。任何想法它應該是什麼?

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

如何'csv_data'正在生成的建議? Rails通常默認爲UTF-8,所以在第二行中將其更改爲'charset = utf-8;'就足夠了。 – 2012-03-09 18:43:32

+0

不,沒有工作。 – Slick23 2012-03-09 19:17:44

回答

18

當Excel打開CSV文件時,它只是假定「iso-8859-1」字符編碼。我猜它甚至不知道你在HTTP回覆中發送的編碼信息。這就是爲什麼將此設置爲UTF-8不起作用的原因。

所以爲了導出爲Excel CSV文件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產生影響,但如果您應該在瀏覽器中打開它,在技術上是正確的)。

+14

使用Ruby 1.9,您可以使用String類處理字符編碼。也可以使用默認配置。這導致更簡單:'send_data csv_string.encode(「iso-8859-1」),:filename => fname,:type =>'text/csv;字符集= ISO-8859-1; header = present'' – 2013-06-19 09:39:30

+1

在我的情況下,接受的答案不起作用(Iconv常量不被識別)。但是,上面評論中提出的解決方案工作得很好。由於轉換字符串編碼的總體思路是正確的,我仍然對這個答案和評論進行投票。 – Ernesto 2014-11-27 16:25:15

+0

'Iconv'從Ruby 1.9.3開始已棄用。但是,'send_data csv_string.encode(「iso-8859-1」),:filename => fname,:type =>'text/csv;字符集= ISO-8859-1; header = present''不適合我。 – Dean 2016-05-27 21:44:00

8

這個工作對我來說,有中國特色擅長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

+0

嗨,你能解釋這是如何工作的CSV.generate(csv = head)接受一個散列? 'csv'從哪裏來?其尚未定義? – user1883793 2013-10-31 09:19:56

+0

附帶紅寶石。 [ruby 1.9.3 csv](http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html#method-i-headers) – 2013-11-12 06:34:46

+0

require'csv'#add this! – 2013-11-12 06:43:06

6

的答案上面並沒有在Mac的Excel工作對我來說: 使用iso-8859-1將需要我替換/刪除奇怪的字符,這是不是一個很好的解決方案,並使用BOMUTF8在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