Welche Codierung öffnet CSV-Dateien mit Excel auf Mac und Windows korrekt?

137

Wir haben eine Web-App, die CSV-Dateien mit Fremdzeichen mit UTF-8 ohne Stückliste exportiert. Sowohl Windows- als auch Mac-Benutzer erhalten Müllzeichen in Excel. Ich habe versucht, mit Stückliste auf UTF-8 zu konvertieren. Excel / Win ist in Ordnung damit, Excel / Mac zeigt Kauderwelsch. Ich verwende Excel 2003 / Win, Excel 2011 / Mac. Hier sind alle Codierungen, die ich ausprobiert habe:

Encoding  BOM      Win                            Mac
--------  ---      ----------------------------   ------------
utf-8     --       scrambled                      scrambled
utf-8     BOM      WORKS                          scrambled
utf-16    --       file not recognized            file not recognized
utf-16    BOM      file not recognized            Chinese gibberish
utf-16LE  --       file not recognized            file not recognized
utf-16LE  BOM      characters OK,                 same as Win
                   row data all in first field

Das beste ist UTF-16LE mit Stückliste, aber die CSV wird nicht als solche erkannt. Das Feldtrennzeichen ist ein Komma, aber das Semikolon ändert nichts.

Gibt es eine Codierung, die in beiden Welten funktioniert?

Timm
quelle
1
Was ist, wenn Sie UTF-16LE für alle Felddaten verwenden, aber das 8-Bit / ASCII-Zeichen für das Komma verwenden? Basierend auf diesem Artikel ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ) interpretiert Excel möglicherweise das Unicode-Komma als Teil der Felddaten anstelle des Trennzeichens.
Jveazey
1
Interessanter Tipp @jveazey. Ich werde dies versuchen: mb_convert_encoding($str, "UTF-16LE");in meinem Exportcode und die Ergebnisse hier posten.
Timm
Nicht, dass Ihnen das hilft, aber ich habe Excel 2007 SP2 unter Windows getestet (mit Notepad2 die Testdateien erstellt). Alles funktionierte mit Ausnahme der UTF-16LE-Stückliste (dasselbe Ergebnis wie unter Windows) und der UTF-16BE-Stückliste (die die Felder korrekt analysierte, aber die Stückliste wurde als die ersten beiden Zeichen in A1 aufgenommen).
Jveazey
Auch fand diese stackoverflow.com/questions/155097/…
jveazey
@hveazey, die zitierte Frage hat eine Antwort, indem sie die Codepage Windows-1252 gruselig empfiehlt. Das hat bei meinem Fall nicht funktioniert (deutsche Umlaute und scharfe s).
Timm

Antworten:

61

Excel-Codierungen

Ich fand die WINDOWS-1252Codierung am wenigsten frustrierend im Umgang mit Excel. Da es sich im Grunde genommen um einen Microsoft-eigenen Zeichensatz handelt, kann man davon ausgehen, dass er sowohl auf dem Mac als auch auf der Windows-Version von MS-Excel funktioniert. Beide Versionen enthalten mindestens einen entsprechenden Selektor für "Dateiursprung" oder "Dateicodierung", der die Daten korrekt liest.

Je nach System und die Werkzeuge , die Sie diese Codierung verwenden, auch genannt werden könnte CP1252, ANSI, Windows (ANSI), MS-ANSIoder nur Windowsunter anderen Variationen.

Diese Codierung ist eine Obermenge von ISO-8859-1(auch bekannt als LATIN1und andere), sodass Sie zurückgreifen können, ISO-8859-1wenn Sie sie nicht verwenden könnenWINDOWS-1252 aus irgendeinem Grund . Beachten Sie, dass ISO-8859-1einige Zeichen fehlen, WINDOWS-1252wie hier gezeigt:

| Char | ANSI | Unicode | ANSI Hex | Unicode Hex | HTML entity | Unicode Name                               | Unicode Range            |
| €    | 128  | 8364    | 0x80     | U+20AC      | €      | euro sign                                  | Currency Symbols         |
| ‚    | 130  | 8218    | 0x82     | U+201A      | ‚     | single low-9 quotation mark                | General Punctuation      |
| ƒ    | 131  | 402     | 0x83     | U+0192      | ƒ      | Latin small letter f with hook             | Latin Extended-B         |
| „    | 132  | 8222    | 0x84     | U+201E      | „     | double low-9 quotation mark                | General Punctuation      |
| …    | 133  | 8230    | 0x85     | U+2026      | …    | horizontal ellipsis                        | General Punctuation      |
| †    | 134  | 8224    | 0x86     | U+2020      | †    | dagger                                     | General Punctuation      |
| ‡    | 135  | 8225    | 0x87     | U+2021      | ‡    | double dagger                              | General Punctuation      |
| ˆ    | 136  | 710     | 0x88     | U+02C6      | ˆ      | modifier letter circumflex accent          | Spacing Modifier Letters |
| ‰    | 137  | 8240    | 0x89     | U+2030      | ‰    | per mille sign                             | General Punctuation      |
| Š    | 138  | 352     | 0x8A     | U+0160      | Š    | Latin capital letter S with caron          | Latin Extended-A         |
| ‹    | 139  | 8249    | 0x8B     | U+2039      | ‹    | single left-pointing angle quotation mark  | General Punctuation      |
| Œ    | 140  | 338     | 0x8C     | U+0152      | Œ     | Latin capital ligature OE                  | Latin Extended-A         |
| Ž    | 142  | 381     | 0x8E     | U+017D      |             | Latin capital letter Z with caron          | Latin Extended-A         |
| ‘    | 145  | 8216    | 0x91     | U+2018      | ‘     | left single quotation mark                 | General Punctuation      |
| ’    | 146  | 8217    | 0x92     | U+2019      | ’     | right single quotation mark                | General Punctuation      |
| “    | 147  | 8220    | 0x93     | U+201C      | “     | left double quotation mark                 | General Punctuation      |
| ”    | 148  | 8221    | 0x94     | U+201D      | ”     | right double quotation mark                | General Punctuation      |
| •    | 149  | 8226    | 0x95     | U+2022      | •      | bullet                                     | General Punctuation      |
| –    | 150  | 8211    | 0x96     | U+2013      | –     | en dash                                    | General Punctuation      |
| —    | 151  | 8212    | 0x97     | U+2014      | —     | em dash                                    | General Punctuation      |
| ˜    | 152  | 732     | 0x98     | U+02DC      | ˜     | small tilde                                | Spacing Modifier Letters |
| ™    | 153  | 8482    | 0x99     | U+2122      | ™     | trade mark sign                            | Letterlike Symbols       |
| š    | 154  | 353     | 0x9A     | U+0161      | š    | Latin small letter s with caron            | Latin Extended-A         |
| ›    | 155  | 8250    | 0x9B     | U+203A      | ›    | single right-pointing angle quotation mark | General Punctuation      |
| œ    | 156  | 339     | 0x9C     | U+0153      | œ     | Latin small ligature oe                    | Latin Extended-A         |
| ž    | 158  | 382     | 0x9E     | U+017E      |             | Latin small letter z with caron            | Latin Extended-A         |
| Ÿ    | 159  | 376     | 0x9F     | U+0178      | Ÿ      | Latin capital letter Y with diaeresis      | Latin Extended-A         |

Notiere dass der Euro-Zeichen fehlt . Diese Tabelle finden Sie bei Alan Wood .

Umwandlung

Die Konvertierung erfolgt in jedem Tool und jeder Sprache anders. Angenommen, Sie haben eine Datei, von query_result.csvder Sie wissen, dass sie UTF-8codiert ist. Konvertieren Sie es zu WINDOWS-1252verwenden iconv:

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
Mikezter
quelle
6
Ein bisschen faff, aber dies scheint die Antwort für den Import von CSV-Dateien mit europäischen Zeichen in Excel unter Mac OSX zu sein
Fergie
1
Wahr. Es beantwortet stattdessen die Frage des OP. In Ihrem Fall müssten Sie zuerst die in Ihrer ".csv-Datei mit europäischen Zeichen" verwendete Codierung kennen (oder erraten). Dann können Sie es in konvertieren WINDOS-1252, was höchstwahrscheinlich sowohl von Mac als auch von Windows Excel korrekt interpretiert wird.
Mikezter
1
Dies ist keine wirkliche Lösung. Früher oder später werden Sie auf ein Zeichen stoßen, das nicht in WINDOWS-1252 konvertierbar ist.
Walter Tross
2
WINDOWS-1252 schlägt fehl, wenn ein chinesisches Schriftzeichen vorhanden ist. Es scheint also, dass UTF-16LE mit Stückliste die einzige Option ist.
XWang
Dies funktioniert gut für SQL-Datenexporte mit diakritischen Zeichen.
Motorbaby
26

Für UTF-16LE mit Stückliste erkennt Excel die Felder, wenn Sie anstelle von Kommas Tabulatorzeichen als Trennzeichen verwenden. Der Grund dafür ist, dass Excel tatsächlich seinen Unicode * .txt-Parser verwendet.

Vorsichtsmaßnahme : Wenn die Datei in Excel bearbeitet und gespeichert wird, wird sie als tabulatorgetrenntes ASCII gespeichert. Das Problem ist nun, dass Excel beim erneuten Öffnen der Datei davon ausgeht, dass es sich um eine echte CSV-Datei (mit Kommas) handelt, dass es sich nicht um Unicode handelt. Analysiert sie daher als durch Kommas getrennt - und erstellt daher einen Hash daraus!

Update : Die obige Einschränkung scheint für mich heute zumindest in Excel 2010 (Windows) nicht zu passieren, obwohl es einen Unterschied im Speicherverhalten zu geben scheint, wenn:

  • Sie bearbeiten und beenden Excel (versucht, als 'Unicode * .txt' zu speichern)

verglichen mit:

  • Bearbeiten und Schließen nur der Datei (funktioniert wie erwartet).
Duncan Smart
quelle
1
Schön, aber die Einschränkung bricht die Lösung für mich; Die Endbenutzer werden mit kaputten Excel-Tabellen nicht zufrieden sein.
Timm
Möglicherweise würde es funktionieren, wenn Sie die anfängliche Dateierweiterung in * .txt ändern, aber dann verlieren Sie die Zuordnung zwischen dem Dateityp und Excel: Das heißt, sie können nicht auf die Datei doppelklicken und sie automatisch in Excel öffnen.
Duncan Smart
Das wird bei mir nicht funktionieren. Da der Endbenutzer nicht mit Computern vertraut ist, muss er sie ohne Hürden in Excel öffnen.
Timm
Ich habe meine ".csv" Excel-Tabellen mit Sonderzeichen und getrennten Feldern gut aussehen. Ich beginne meine Ausgabezeichenfolge mit "\ ufeff" als Stücklistenreihenfolge (BOM), verwende dann anstelle von Kommas "\ t" -Register für die Feldtrennung und codiere die Datei mit "utf-16LE". Funktioniert wie ein Zauber, dank dieser Seite!
Geek Stocks
sep=,Die Codierung der ersten Zeile und der UTF16LE funktionierte für mich und erforderte kein anderes Trennzeichen (es blieb ein Komma). Durch Öffnen der Datei durch Doppelklick wurde die Datei korrekt geladen, wobei Sonderzeichen und Zeilenumbrüche in den Zellen intakt waren. Nachteil: Der sep=,Header wird von keinem Programm außer Excel erkannt, soweit ich gesehen habe. OpenOffice / LibreOffice erfordern diesen Hack jedoch ohnehin nicht (Zeilenumbrüche im Zelleninhalt funktionieren einwandfrei, während das Laden aus einer Textdatei / die Verwendung des Text in Spalten-Assistenten in Excel Zeilenumbrüche in Zellen nicht ordnungsgemäß behandelt).
CodeManX
24

Das Wichtigste ist: Es gibt keine Lösung. Excel 2011 / Mac kann eine CSV-Datei mit Umlauten und diakritischen Zeichen nicht richtig interpretieren, unabhängig davon, welche Codierung oder welchen Umfang Sie verwenden. Ich würde mich freuen, wenn mir jemand etwas anderes sagt!

Timm
quelle
4
Ich habe festgestellt, dass die WIN-1252- oder ISO-8859-1-Codierungen funktionieren. Bitte sehen Sie meine Antwort.
Mikezter
3
Die Lösung besteht darin, UTF-16LE zu verwenden und sicherzustellen, dass Sie Registerkarten verwenden, um Spalten anstelle von Kommas zu trennen.
Tim Groeneveld
Haben Sie das wirklich auf Win und Mac Tim versucht? Wie bereits erwähnt, ist TSV in meinem Fall keine Option.
Timm
1
Für mich funktioniert der Export einwandfrei, wenn ich die WIN-1252-Codierung sowohl auf Mac- als auch auf Windows-Versionen von Excel verwende. @Timm, du solltest erwägen, die akzeptierte Antwort zu ändern.
Pierre Arnaud
2
Hatten Sie für diejenigen, die dies fanden, tatsächlich erweiterte (wie chinesische) Zeichen in Ihren Datensätzen? Die WIN-1252-Codierung bricht bei diesen ab, weil sie außerhalb des Bereichs liegen.
Bill Leeper
11

Sie haben nur durch Kommas und Semikolons getrennte CSVs ausprobiert. Wenn Sie CSV mit Tabulatoren (auch TSV genannt) ausprobiert hätten, hätten Sie die Antwort gefunden:

UTF-16LE mit Stückliste (Byte Order Mark), tabulatorgetrennt


Aber : In einem Kommentar erwähnen Sie, dass TSV keine Option für Sie ist (ich konnte diese Anforderung in Ihrer Frage jedoch nicht finden). Das ist schade. Dies bedeutet häufig, dass Sie die manuelle Bearbeitung von TSV-Dateien zulassen, was wahrscheinlich keine gute Idee ist. Die visuelle Überprüfung von TSV-Dateien ist kein Problem. Darüber hinaus können Editoren so eingestellt werden, dass sie ein Sonderzeichen zum Markieren von Registerkarten anzeigen.

Und ja, ich habe das unter Windows und Mac ausprobiert.

Walter Tross
quelle
4

Hier ist der Clou zum Importieren von utf8-codiertem CSV in Excel 2011 für Mac: Microsoft sagt: "Excel für Mac unterstützt UTF-8 derzeit nicht." Excel für Mac 2011 und UTF-8

Yay, weit weg MS!

Timm
quelle
4

Die beste Problemumgehung zum Lesen von CSV-Dateien mit UTF-8 auf dem Mac besteht darin, sie in das XLSX-Format zu konvertieren. Ich habe ein Skript von Konrad Foerstner gefunden, das ich ein wenig verbessert habe, indem ich Unterstützung für verschiedene Trennzeichen hinzugefügt habe.

Laden Sie das Skript von Github https://github.com/brablc/clit/blob/master/csv2xlsx.py herunter . Um es auszuführen, müssen Sie ein Python-Modul openpyxl für die Bearbeitung von Excel-Dateien installieren : sudo easy_install openpyxl.

brablc
quelle
3

In meinem Fall hat dies funktioniert (Mac, Excel 2011, sowohl kyrillische als auch lateinische Zeichen mit tschechischen Diakritika):

  • Zeichensatz UTF-16LE (einfach UTF-16 war nicht genug)
  • Stückliste "\ xFF \ xFE"
  • \ t (Tab) als Trennzeichen
  • Vergessen Sie nicht, auch Separator und CRLFs zu codieren :-)
  • Verwenden Sie iconv anstelle von mb_convert_encoding
Marek Demčák
quelle
2

Es scheint mir, dass Excel 2011 für Mac OS Encoding.GetEncoding ("10000") nicht verwendet, wie ich dachte und 2 Tage damit verschwendete, aber die gleiche ISO wie unter Microsoft OS. Der beste Beweis dafür ist, eine Datei in Excel 2011 für MAC mit speziellen Zeichen zu erstellen, sie als CSV zu speichern und sie dann im MAC-Texteditor zu öffnen, und die Zeichen werden verschlüsselt.

Für mich hat dieser Ansatz funktioniert - was bedeutet, dass der CSV-Export unter Excel 2011 unter MAC OS spezielle westeuropäische Zeichen enthält:

Encoding isoMacOS = Encoding.GetEncoding("iso-8859-1");
Encoding defaultEncoding = Encoding.Default; 

// Convert the string into a byte array.
byte[] defaultEncodingBytes = defaultEncoding.GetBytes(exportText);

// Perform the conversion from one encoding to the other.
byte[] ansiBytes = Encoding.Convert(defaultEncoding, isoMacOS, defaultEncodingBytes);

decodedString = isoMacOS.GetString(ansiBytes);
user525081
quelle
Welche Sprache verwenden Sie @ user525081? Können Sie es in PHP übersetzen?
Timm
@Timm, das aussieht wie ein Java-Beispiel, aber in PHP können Sie iconv verwenden, um die Konvertierung durchzuführen
Ashish Datta
OK @ user525081, das gleiche Angebot wie bei den anderen Antworten. Dies richtet sich an Mac-Benutzer und lässt Windows-Benutzer im Stich. und es beantwortet nicht die ursprüngliche Frage - eine Codierung, die auf beiden Plattformen funktioniert. Vielen Dank.
Timm
2

UTF-8 ohne Stückliste funktioniert derzeit für mich in Excel Mac 2011 14.3.2.

UTF-8 + BOM funktioniert, aber BOM wird als Kauderwelsch gerendert.

UTF-16 funktioniert, wenn Sie die Datei importieren und den Assistenten abschließen, jedoch nicht, wenn Sie nur darauf doppelklicken.

Craig Stuntz
quelle
2

Folgendes hat für mich unter Excel für Mac 2011 und Windows Excel 2002 funktioniert:

  1. Konvertieren Sie die Datei mit iconv auf einem Mac in UTF-16 Little-Endian + nennen Sie sie * .txt (die Erweiterung .txt zwingt Excel, den Textimport-Assistenten auszuführen):

    iconv -f UTF-8 -t UTF-16LE filename.csv >filename_UTF-16LE.csv.txt

  2. Öffnen Sie die Datei in Excel und wählen Sie im Textimport-Assistenten:

    • Schritt 1: Dateiursprung : Ignorieren Sie sie, es spielt keine Rolle, was Sie wählen
    • Schritt 2: Wählen Sie die richtigen Werte für Trennzeichen und Textqualifizierer aus
    • Schritt 3: Wählen Sie gegebenenfalls Spaltenformate aus

PS Der von iconv erstellte UTF-16LE hat am Anfang Stücklistenbytes FF FE.

PPS Meine ursprüngliche CSV-Datei wurde auf einem Windows 7-Computer im UTF-8-Format (mit den Stücklistenbytes EF BB BF am Anfang) erstellt und verwendet CRLF-Zeilenumbrüche. Komma wurde als Feldtrennzeichen und einfaches Anführungszeichen als Textqualifizierer verwendet. Es enthielt ASCII-Buchstaben sowie verschiedene lateinische Buchstaben mit Tildes, Umlaut usw. sowie einige kyrillische Buchstaben. Alle werden in Excel für Win und Mac korrekt angezeigt.

PPPS Exakte Softwareversionen:
* Mac OS X 10.6.8
* Excel für Mac 2011 v.14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701.2625

Koit Saarevet
quelle
Wenn Sie eine UTF-8-Datei ohne Stückliste haben, konvertiert iconv sie in UTF-16LE ohne Stückliste (und leider gibt es keine Möglichkeit, iconv anzuweisen, eine hinzuzufügen)
Walter Tross
2

Unter meinem Mac OS identifizierte Text Wrangler eine mit Excel erstellte CSV-Datei als "westlich" codiert.

Nach einigem googeln habe ich dieses kleine Skript erstellt (ich bin mir nicht sicher, ob Windows verfügbar ist, vielleicht mit Cygwin ?):

$ cat /usr/local/bin/utf8.sh

#!/bin/bash

INPUTFILE="$1"

iconv -f macroman -c -t UTF-8 $INPUTFILE |tr '\r' '\n' >/tmp/file.$$.csv

mv $INPUTFILE ms_trash
mv /tmp/file.$$.csv $INPUTFILE
Nuno
quelle
Dies ist das einzige, was für mich unter OS X 10.14.2 (und Excel 2011) funktioniert hat
Donald
1

In meinem Fall hat das Hinzufügen der Präambel zur Datei mein Problem gelöst:

var data = Encoding.UTF8.GetBytes(csv);
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
return File(new MemoryStream(result), "application/octet-stream", "data.csv");
Rasiermesser
quelle
0

Versuchen Sie anstelle von CSV, HTML mit einer XLS-Erweiterung und dem MIME-Typ "application / excel" auszugeben. Ich weiß, dass dies unter Windows funktioniert, kann aber nicht für MacOS sprechen

royce3
quelle
Danke @ royce23, aber ich biete nur die CSV-Datei zum Download an. Ich kann es nicht über HTTP präsentieren, da die schiere Größe des Markups die Reaktion auf ein Crawlen verlangsamen würde - die exportierte Tabelle kann Millionen von Zeilen enthalten ...
Timm
Mit CSS wäre Ihr HTML nur ein winziger Bruchteil größer als CSV, zum Beispiel: <r> <c> id </ c> <c> Name </ c> <c> Telefon </ c> </ r>
royce3
Ich bin mir nicht sicher, ob ich das verstehe, aber ich speichere die CSV auf dem Server und biete einen Download-Link an. Das Generieren einer HTML-Antwort verschlingt zu viel PHP-Speicher ...
Timm
Dies wird funktionieren (die UTF-8-Zeichen), aber wenn Sie Zeilenumbrüche in Zellen ( brTag) eingebettet haben , ignoriert Excel für Mac das (funktioniert mit Windows) CSS mso-data-placement:same-cell;
Cropredy
0

Das funktioniert bei mir

  1. Öffnen Sie die Datei in BBEdit oder TextWrangler *.
  2. Legen Sie die Datei als Unicode (UTF-16 Little-Endian) fest (Zeilenenden können Unix oder Windows sein). Sparen!
  3. In Excel: Daten> Externe Daten abrufen> Textdatei importieren ...

Wählen Sie nun als Schlüsselpunkt MacIntosh als Dateiursprung (dies sollte die erste Wahl sein).

Dies verwendet Excel 2011 (Version 14.4.2)

* Am unteren Rand des Fensters befindet sich ein kleines Dropdown-Menü

Gazzer
quelle
0

Lösen Sie dies mit Java (UTF-16LE mit Stückliste):

String csvReportStr = getCsvReport();
byte[] data = Charset.forName("UTF-16LE").encode(csvReportStr)
    .put(0, (byte) 0xFF)
    .put(1, (byte) 0xFE)
    .array();

Beachten Sie, dass die CSV-Datei verwendet werden sollte TAB als Trennzeichen verwendet werden sollte. Sie können die CSV-Datei sowohl unter Windows als auch unter MAC OS X lesen.

Siehe: Wie codiere / decodiere ich UTF-16LE-Bytearrays mit einer Stückliste?

blauer Pfeil
quelle