2015-05-21 1 views
5

Ich erzeuge CSV-Dateien, die in Excel geöffnet und überprüft werden müssen, sobald sie erzeugt wurden. Es scheint, dass Excel eine andere Codierung als UTF-8 benötigt.Ruby: Wie man CSV-Dateien erzeugt, die Excel-freundliche Kodierung haben

Hier ist meine Config und Erzeugung Code:

csv_config = {col_sep: ";", 
       row_sep: "\n", 
       encoding: Encoding::UTF_8 
      } 

csv_string = CSV.generate(csv_config) do |csv| 
    csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] 
end 

Wenn diese in Excel öffnen, werden die Sonderzeichen richtig zu werden nicht angezeigt:

Text a Text b Text æ Text ø Text å 

Jede Idee, wie die richtige Codierung zu gewährleisten?

+0

Versuchen Sie, '# encoding: UTF-8' als erste Zeile Ihrer Ruby-Datei zu setzen (zweitens, wenn Sie eine Hash-Bang-Zeile haben,' #!/Usr/bin/env ruby'). Ich glaube, Sie schreiben * in UTF-8, aber die Ruby-Quelldatei wird als US_ASCII codiert. (Mit Ruby 2.0+, Quellcodierung standardmäßig auf UTF-8) – Amadan

+0

Ich benutze 'Ruby 2.0.0p247 (2013-06-27 Revision 41674) [x86_64-darwin12.4.0]' also nehme ich an, dass meine Installation bereits bedeutet standardmäßig UTF-8. – ChristofferJoergensen

+2

Keine Erfahrung mit Ruby. Excel kann jedoch Semikolon-getrennte CSV-Dateien öffnen, die UTF-8-codiert sind. Aber die Datei muss am Anfang eine Stückliste haben. Und ob das Semikolon als Trennzeichen verwendet werden kann, hängt vom Gebietsschema ab. Der beste Ansatz besteht also in der Verwendung von tabulatorbegrenzten CSV-Dateien und UTF-16LE-codierten Dateien. Dies sollte die meisten Gebietsschema unabhängig sein. –

Antwort

7

Sie sollten die Codierung ISO-8859-1 wie folgt wechseln:

CSV.generate(encoding: 'ISO-8859-1') { |csv| csv << ["Text á", "Text é", "Text æ"] } 

Für Ihren Kontext, können Sie dies tun:

config = { 
    col_sep: ';', 
    row_sep: ';', 
    encoding: 'ISO-8859-1' 
} 

CSV.generate(config) { |csv| csv << ["Text á", "Text é", "Text æ"] } 

Ich hatte das gleiche Problem und dass die feste Codierung.

+0

Die obige Antwort funktionierte für mich, aber erst nachdem ich die Argumente 'col_sep' und' row_sep' entfernt habe. Nur das 'encoding: 'ISO-8859-1'' war alles was ich brauchte.Für den Kontext war das spezielle Problem, das ich hatte, "é" Zeichen, die als 'Ã ©' –

+0

Guter Fang Greg erscheinen, ich werde das Beispiel ohne den Kontext aktualisieren. – joaofraga

5

Die beste Antwort von @joaofraga funktioniert für mich, aber ich fand eine alternative Lösung, die auch funktioniert - keine UTF-8 nach ISO-8859-1 Transcodierung erforderlich.

Von dem, was ich gelesen habe, kann Excel in der Tat UTF-8 behandeln, aber aus irgendeinem Grund erkennt es es standardmäßig nicht. Aber wenn Sie eine Stückliste an den Anfang der CSV-Daten hinzufügen, scheint dies Excel zu erkennen, dass die Datei UTF-8 ist. So

, wenn Sie eine CSV haben etwa so:

csv_string = CSV.generate(csv_config) do |csv| 
    csv << ["Text a", "Text b", "Text æ", "Text ø", "Text å"] 
end 

nur ein BOM Byte hinzufügen wie folgt:

"\uFEFF" + csv_string 

In meinem Fall mein Controller wird die CSV als Datei senden, so ist es das, was mein Controller wie folgt aussieht:

def show 
    respond_to do |format| 
    format.csv do 
     # add BOM to force Excel to realise this file is encoded in UTF-8, so it respects special characters 
     send_data "\uFEFF" + csv_string, type: :csv, filename: "csv.csv" 
    end 
    end 
end 

sollte ich, dass UTF-8 beachten Sie selbst nicht erf Uire oder empfehlen Sie eine Stückliste überhaupt, aber wie ich bereits erwähnt, schien es in diesem Fall hinzufügen Excel zu erkennen, dass die Datei in der Tat UTF-8 war.

+0

netter Trick scheint, wie es jetzt auf Excel funktioniert –

Verwandte Themen