2012-03-09 12 views
11

मैं रेल में और मेरे से कुछ फ़ील्ड एक CSV फ़ाइल में डेटा निर्यात कर रहा हूँ, मैं इस तरह वर्ण एन्कोडिंग मुद्दों हो रही है जब मैं Excel में खोलने के लिए रेल डेटा निर्यात:चरित्र एन्कोडिंग मुद्दा सीएसवी

didn’t 

मैंने इस कोड को एक उदाहरण से उधार लिया और मुझे लगता है कि एन्कोडिंग बंद है। कोई विचार यह क्या होना चाहिए?

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

कैसे की जाती है 'उत्पन्न किया जा रहा csv_data' ने सुझाव दिया है? रेल आमतौर पर यूटीएफ -8 में चूक जाती है, इसलिए इसे दूसरी पंक्ति में 'charset = utf-8;' में बदलने के लिए पर्याप्त हो सकता है। –

+0

नहीं, काम नहीं कर रहा है। – Slick23

उत्तर

18

जब एक्सेल CSV फ़ाइल खोलता है तो यह केवल "आईएसओ -885 9 -1" वर्ण एन्कोडिंग मानता है। मुझे लगता है कि यह आपके HTTP उत्तर में आपके द्वारा भेजी गई एन्कोडिंग जानकारी के बारे में भी नहीं जानता है। यही कारण है कि इसे यूटीएफ -8 में स्थापित करना काम नहीं करता है।

तो आदेश रेल में 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 डेटा स्ट्रिंग (कि रेल डिफ़ॉल्ट है) आईएसओ 8859 के लिए फिर से encodes और भेजता है यह। साथ ही यह जानकारी भी जाती है कि यह उत्तर वास्तव में आईएसओ -885 9 -1 एन्कोडेड है (जो Excel के लिए कोई फर्क नहीं पड़ता है लेकिन तकनीकी रूप से सही है यदि आपको इसे ब्राउज़र में खोलना चाहिए आदि)।

+14

रूबी 1.9 के साथ आप स्ट्रिंग क्लास के साथ वर्ण एन्कोडिंग को संभाल सकते हैं। इसके अलावा स्वभाव डिफ़ॉल्ट का उपयोग किया जा सकता है। इसका परिणाम सरल होता है: 'send_data csv_string.encode (" iso-8859-1 "), फ़ाइल नाम => fname,: type => 'text/csv; charset = iso-8859-1; हेडर = वर्तमान ' –

+1

मेरे मामले में स्वीकृत उत्तर काम नहीं किया (Iconv निरंतर मान्यता प्राप्त नहीं है)। हालांकि, उपर्युक्त टिप्पणी में प्रस्तावित समाधान ठीक काम करता है। मैं अभी भी इस उत्तर और टिप्पणी को अप-वोट कर रहा हूं, क्योंकि स्ट्रिंग एन्कोडिंग को परिवर्तित करने का समग्र विचार सही है। – Ernesto

+0

'Iconv' रूबी 1.9.3 के रूप में बहिष्कृत है। हालांकि, 'send_data csv_string.encode (" iso-8859-1 "), फ़ाइल नाम => fname,: type => 'text/csv; charset = iso-8859-1; हेडर = वर्तमान 'मेरे लिए काम नहीं किया। – Dean

8

यह मेरे लिए काम किया चीनी अक्षरों के साथ, csv fromat (बीओएम + 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) के रूप में कैसे काम करता है एक हैश स्वीकार करता है? और 'सीएसवी' कहां से आता है? इसे अभी तक परिभाषित नहीं किया गया है? – user1883793

+0

रूबी के साथ जहाजों। [रूबी 1.9.3 सीएसवी] (http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html#method-i-headers) –

+0

'csv' की आवश्यकता है # इसे जोड़ें! –

6

जवाब ऊपर मैक एक्सेल पर मेरे लिए काम नहीं किया: iso-8859-1 का उपयोग करने के लिए मुझे अजीब पात्रों को प्रतिस्थापित/निकालने की आवश्यकता होगी, जो मेरे लिए पर्याप्त समाधान नहीं है, और BOM का उपयोग UTF8 के साथ विंडोज के तहत काम किया लेकिन मैक एक्सेल के तहत नहीं।

क्या मेरे लिए काम किया 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 
संबंधित मुद्दे