Ich exportiere programmgesteuert Daten (mit PHP 5.2) in eine CSV-Testdatei.
Beispieldaten: Numéro 1
(beachten Sie das akzentuierte e). Die Daten sind utf-8
(keine vorangestellte Stückliste).
Wenn ich diese Datei in MS Excel öffne, wird angezeigt als Numéro 1
.
Ich kann dies in einem Texteditor (UltraEdit) öffnen, der es korrekt anzeigt. UE meldet, dass der Charakter ist decimal 233
.
Wie kann ich Textdaten in eine CSV-Datei exportieren, damit MS Excel sie korrekt rendert , vorzugsweise ohne die Verwendung des Importassistenten oder nicht standardmäßiger Assistenteneinstellungen zu erzwingen?
excel
encoding
csv
diacritics
Freddo411
quelle
quelle
Antworten:
Eine korrekt formatierte UTF8-Datei kann als erste drei Oktette ein Byte Order Mark enthalten . Dies sind die Hex-Werte 0xEF, 0xBB, 0xBF. Diese Oktette dienen dazu, die Datei als UTF8 zu markieren (da sie nicht als Informationen zur "Bytereihenfolge" relevant sind). 1 Wenn diese Stückliste nicht vorhanden ist, kann der Verbraucher / Leser den Codierungstyp des Textes ableiten. Leser, die nicht UTF8-fähig sind, lesen die Bytes wie eine andere Codierung wie Windows-1252 und zeigen die Zeichen

am Anfang der Datei an.Es gibt einen bekannten Fehler, Excel, auf UTF8 CSV - Dateien über Dateizuordnung zu öffnen, geht davon aus, dass sie in einer Single-Byte - Codierung sind, abgesehen von der Anwesenheit der UTF8 BOM. Dies kann nicht durch eine Systemstandard-Codepage oder Spracheinstellung behoben werden. Die Stückliste gibt in Excel keinen Hinweis - es funktioniert einfach nicht. (In einem Minderheitsbericht wird behauptet, dass die Stückliste manchmal den Assistenten "Text importieren" auslöst.) Dieser Fehler scheint in Excel 2003 und früheren Versionen vorhanden zu sein. Die meisten Berichte (inmitten der Antworten hier) sagen, dass dies in Excel 2007 und neuer behoben ist.
Beachten Sie, dass Sie können immer * richtig öffnen UTF8 CSV - Dateien in Excel die „Import Text“ Assistenten, mit dem Sie die Codierung der Datei , die Sie Öffnung angeben können. Das ist natürlich viel weniger bequem.
Leser dieser Antwort befinden sich höchstwahrscheinlich in einer Situation, in der sie Excel <2007 nicht besonders unterstützen, aber rohen UTF8-Text an Excel senden, der ihn falsch interpretiert und Ihren Text mit
Ã
und ähnlichen Windows-1252-Zeichen besprüht. Das Hinzufügen der UTF8-Stückliste ist wahrscheinlich die beste und schnellste Lösung.Wenn Sie mit älteren Excel-Benutzern nicht weiterkommen und Excel der einzige Verbraucher Ihrer CSVs ist, können Sie dies umgehen, indem Sie UTF16 anstelle von UTF8 exportieren. Excel 2000 und 2003 doppelklicken diese korrekt. (Einige andere Texteditoren können Probleme mit UTF16 haben, daher müssen Sie Ihre Optionen möglicherweise sorgfältig abwägen.)
* Außer wenn Sie dies nicht können, funktioniert der Import-Assistent von Excel 2011 für Mac (zumindest) nicht immer mit allen Codierungen, unabhängig davon, was Sie ihm sagen. </ anecdotal-evidence> :)
quelle

in der ersten Zelle; oder etwas ganz anderes.
). Es hilft nur beim Erraten von Algorithmen und für Dateiformate, die dies speziell berücksichtigen (z. B. XML). Der Nachteil beim Einfügen einer Faux-Stückliste in UTF-8-Dateien besteht darin, dass Sie die ASCII-Kompatibilität beeinträchtigen (ein wichtiges Verkaufsargument für UTF-8). Viele codierungsunwissende Textwerkzeuge werden mit einer unerwartet führenden Faux-Stückliste konfrontiert.Das Voranstellen einer Stückliste (\ uFEFF) funktionierte für mich (Excel 2007), da Excel die Datei als UTF-8 erkannte. Andernfalls funktioniert das Speichern und Verwenden des Importassistenten, ist jedoch weniger ideal.
quelle
\ufeff
ist eine UTF-16 (BE) Stückliste keine UTF-8 StücklisteUnten ist der PHP-Code, den ich in meinem Projekt verwende, wenn ich Microsoft Excel an den Benutzer sende:
AKTUALISIERT: Dateinamenverbesserung und BUG korrigieren die korrekte Längenberechnung. Danke an TRiG und @ ivanhoe011
quelle
'Content-Disposition: attachment; filename="'.$filename.'.csv"'
Weil Firefox doppelte Anführungszeichen möchte, oder wenn Sie Ihren Dateinamen nach einem Leerzeichen abschneiden.text/csv
) aus, nennen es aber Excel (application/vnd.ms-excel
)?header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));
?Die Antwort für alle Kombinationen von Excel-Versionen (2003 + 2007) und Dateitypen
Die meisten anderen Antworten betreffen nur die Excel-Version und helfen Ihnen nicht unbedingt, da ihre Antwort für Ihre Excel-Version möglicherweise nicht zutrifft.
Das Hinzufügen des Stücklistenzeichens führt beispielsweise zu Problemen bei der automatischen Erkennung von Spaltentrennzeichen, jedoch nicht bei jeder Excel-Version.
Es gibt 3 Variablen, die bestimmen, ob es in den meisten Excel-Versionen funktioniert:
Jemand, der bei SAP stoisch war, versuchte jede Kombination und berichtete über das Ergebnis. Endresultat? Verwenden Sie UTF16le mit Stückliste und Tabulatorzeichen als Trennzeichen, damit es in den meisten Excel-Versionen funktioniert.
Du glaubst mir nicht? Ich würde es auch nicht tun, aber hier lesen und weinen: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator
quelle
sep=,
oder was auch immer Sie verwenden möchten? Wenn Sie die Stückliste bereits hinzufügen, sind Sie vermutlich nicht abgeneigt, der Datei Inhalte hinzuzufügen.Wählen Sie beim Importieren UTF-8 aus. Wenn Sie Office 2007 verwenden, haben Sie es hier ausgewählt: direkt nach dem Öffnen der Datei.
quelle
Echo UTF-8-Stückliste vor der Ausgabe von CSV-Daten. Dies behebt alle Zeichenprobleme in Windows, funktioniert jedoch nicht für Mac.
Es funktioniert für mich, weil ich eine Datei generieren muss, die nur auf Windows-PCs verwendet wird.
quelle
UTF-8 funktioniert in Office 2007 nicht ohne Service Pack, mit oder ohne Stückliste (U + ffef oder 0xEF, 0xBB, 0xBF, funktioniert auch nicht). Durch die Installation von sp3 funktioniert UTF-8, wenn 0xEF, 0xBB, 0xBF Stückliste ist vorangestellt.
UTF-16 funktioniert beim Codieren in Python mit "utf-16-le" mit einer vorangestellten 0xff 0xef-Stückliste und unter Verwendung der Registerkarte als Trennzeichen. Ich musste die Stückliste manuell ausschreiben und dann "utf-16-le" anstelle von "utf-16" verwenden, andernfalls stellte jede encode () die Stückliste jeder ausgeschriebenen Zeile voran, die als Müll in der ersten Spalte der erschien zweite Zeile und danach.
Ich kann nicht sagen, ob UTF-16 ohne installiertes SP funktionieren würde, da ich jetzt nicht zurückkehren kann. Seufzer
Dies ist auf Windows, keine Ahnung über Office für MAC.
In beiden Arbeitsfällen funktioniert der Import, wenn ein Download direkt vom Browser aus gestartet wird, und der Textimport-Assistent greift nicht ein, sondern wie erwartet.
quelle
Wie Fregal sagte, ist \ uFEFF der richtige Weg.
quelle
Ich habe auch bemerkt, dass die Frage vor einiger Zeit "beantwortet" wurde, aber ich verstehe die Geschichten nicht, die besagen, dass Sie eine utf8-codierte CSV-Datei nicht erfolgreich in Excel öffnen können, ohne den Textassistenten zu verwenden.
Meine reproduzierbare Erfahrung:
Old MacDonald had a farm,ÈÌÉÍØ
Geben Sie in den Editor ein, drücken Sie die Eingabetaste und dann Speichern unter (mit der Option UTF-8).Verwenden von Python, um zu zeigen, was tatsächlich darin enthalten ist:
Gut. Notepad hat eine Stückliste vorne platziert.
Gehen Sie nun in den Windows Explorer, doppelklicken Sie auf den Dateinamen oder klicken Sie mit der rechten Maustaste und verwenden Sie "Öffnen mit ...". Daraufhin wird Excel (2003) mit der erwarteten Anzeige angezeigt.
quelle
open('oldmac.csv', 'rb').read()
Ihre Eingabe überprüft?Sie können eine HTML-Datei mit der Erweiterung 'xls' speichern und Akzente funktionieren (mindestens vor 2007).
Beispiel: Speichern Sie dies (mit Save As utf8 im Editor) als test.xls:
quelle
border="1"
auf den Tisch, Sie tun Linien, aber nur um die 4 - Zellen :)Dies ist nur eine Frage der Zeichenkodierung. Es sieht so aus, als würden Sie Ihre Daten als UTF-8 exportieren: é in UTF-8 ist die Zwei-Byte-Sequenz 0xC3 0xA9, die bei Interpretation in Windows-1252 Ã © ist. Stellen Sie beim Importieren Ihrer Daten in Excel sicher, dass die von Ihnen verwendete Zeichenkodierung UTF-8 ist.
quelle
Das CSV-Format wird in Excel als ASCII und nicht als Unicode implementiert, wodurch die diakritischen Zeichen entstellt werden. Wir hatten das gleiche Problem, mit dem ich herausgefunden habe, dass der offizielle CSV-Standard in Excel als ASCII-basiert definiert wurde.
quelle
Excel 2007 liest UTF-8 ordnungsgemäß mit Stücklisten (EF BB BF) codierter CSV.
Excel 2003 (und möglicherweise früher) liest UTF-16LE mit Stückliste (FF FE), jedoch mit TABs anstelle von Kommas oder Semikolons.
quelle
Ich kann CSV nur dazu bringen, in Excel 2007 als tabulatorgetrenntes Little-Endian-UTF-16 richtig zu analysieren, beginnend mit der richtigen Bytereihenfolge.
quelle
Das Schreiben einer Stückliste in die Ausgabe-CSV-Datei hat in Django tatsächlich funktioniert:
Für weitere Informationen http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Danke Jungs!
quelle
printWriter.print('\ufeff')
siehe auch Hinzufügen einer UTF-8-Stückliste in Java .Eine andere Lösung, die ich gefunden habe, bestand darin, das Ergebnis als Windows Code Page 1252 (Windows-1252 oder CP1252) zu codieren. Dies würde zum Beispiel dadurch geschehen, dass eine
Content-Type
entsprechende Einstellung vorgenommen wirdtext/csv; charset=Windows-1252
und die Zeichenkodierung des Antwortstroms auf ähnliche Weise eingestellt wird.quelle
Beachten Sie, dass das Einfügen der UTF-8-Stückliste nicht unbedingt eine gute Idee ist. Mac-Versionen von Excel ignorieren dies und zeigen die Stückliste tatsächlich als ASCII an. Drei unangenehme Zeichen am Anfang des ersten Felds in Ihrer Tabelle.
quelle
'\uFEFF' + myCsvString
funktioniert wie erwartet unter Mac Excel 15.19.1 (2016).Überprüfen Sie die Codierung, in der Sie die Datei generieren. Damit Excel die Datei korrekt anzeigt, müssen Sie die Standardcodepage des Systems verwenden.
Welche Sprache benutzt du? Wenn es sich um .Net handelt, müssen Sie beim Generieren der Datei nur Encoding.Default verwenden.
quelle
Wenn Sie wie ich Legacy-Code in vb.net haben, hat der folgende Code für mich funktioniert:
quelle
Ich habe einen Weg gefunden, das Problem zu lösen. Dies ist ein böser Hack, aber er funktioniert: Öffnen Sie das Dokument mit Open Office und speichern Sie es in einem beliebigen Excel-Format. Das resultierende
.xls
oder.xlsx
zeigt die akzentuierten Zeichen an.quelle
Mit Ruby 1.8.7 codiere ich jedes Feld in UTF-16 und verwerfe die Stückliste (vielleicht).
Der folgende Code wird aus active_scaffold_export extrahiert:
Die wichtige Zeile lautet:
quelle
Öffnen Sie die Datei csv mit notepad ++ clic auf Encode, wählen Sie Konvertieren in UTF-8 (nicht in UTF-8 konvertieren (ohne Stückliste))
quelle