Unicode Text-Datei oder csv mit PHP erstellen - UTF-8 - z.B. für Excel
Sie haben einen Content, der mit UTF-8 kodiert ist, z.B. Werte aus einer Datenbank, die UTF-8 basiert ist. Diesen Content (Text, Feldinhalte) möchten Sie jetzt in eine .txt oder eine .csv-Datei speichern. Eben auch als Unicode (UTF-8).
Und diese Datei dann in jedem Editor auch korrekt dargestellt bekommen.
Wenn Sie es ganz normal mit folgendem Code machen, produzieren Sie eine ASCII-Datei:
$path = 'path/to/directory/';
$fileName = 'myFile.txt';
$file = fopen($path . $fileName, 'w');
fwrite($file, $content);
fclose ($file);
$fileName = 'myFile.txt';
$file = fopen($path . $fileName, 'w');
fwrite($file, $content);
fclose ($file);
Die PHP-Funktionen fwrite und fputs speichern automatisch die Inhalte als ASCII - also nicht Unicode, nicht UTF-8. Egal, was die Kodierung des Augangstextes ist, Ergebnis ist definitiv nicht Unicode. D.h. jeder Editor öffnet die Datei als ASCII - Ergebnis: Umlaute und andere Sonderzeichen sind "zerschossen", also nicht korrekt dargestellt.
Lösung des Problems mit UTF-8 und csv/Text-Datei
Sie müssen am Anfang der Datei den BOM einfügen. Wenn Sie nicht wissen, was BOM ist, schauen Sie bei Wikipedia BOM nach.Der oben erwähnte Code sieht dann für UTF-8 folgendermaßen aus:
$path = 'path/to/directory/';
$fileName = 'myFile.txt';
$file = fopen($path . $fileName, 'w');
fwrite($file, chr(239) . chr(187) . chr(191) . $content);
fclose ($file);
$fileName = 'myFile.txt';
$file = fopen($path . $fileName, 'w');
fwrite($file, chr(239) . chr(187) . chr(191) . $content);
fclose ($file);
Wichtig ist, dass man die Kodierung des BOM als chr() schreibt und nicht als String "\xEF\xBB\xBF".
Für andere Kodierungen brauchen Sie dann einen anderen BOM (z.B. für UTF-16BE: chr(254) . chr(255) ).
CSV-Datei fürs Excel
Wenn Sie möchten, dass die Datei vom User mit einem Doppelklick im Excel geöffnet werden kann (und leserlich dargestellt wird), müssen Sie folgenden Code verwenden:
$path = 'path/to/directory/';
$fileName = 'myFile.csv';
$file = fopen($path . $fileName, 'w');
fwrite($file, chr(255) . chr(254) . mb_convert_encoding( $content, 'UTF-16LE', 'UTF-8'));
fclose ($file);
Quelle: http://de.php.net/manual/de/function.fwrite.php$fileName = 'myFile.csv';
$file = fopen($path . $fileName, 'w');
fwrite($file, chr(255) . chr(254) . mb_convert_encoding( $content, 'UTF-16LE', 'UTF-8'));
fclose ($file);
Excel hat so seine Spezifika. Die optimale csv-Datei fürs Excel, die mit einem Doppelklick geöffnet wird, hat die Spalten tabstopgetrennt und wird in der oben genannten Weise gespeichert. Der Code konvertiert Ihren UTF-8-Content in UTF-16LE (little endian) Content fürs Excel.
Warum auch immer, eine so gespeicherte csv-Datei lässt sich sowohl in einer Windows-Umgebung als auch auf einem Mac öffnen. Mit korrekt dargestellten Sonderzeichen (Umlaute usw.).