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);

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);


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

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.).