Datei als UTF-8
lixx
- php
Hallo!
Ich plage mich seit längerem mit einer CSV-Datei herum, die über PHP heruntergeladen werden soll.
Was ich gerne hätte ist eine Art universelle UTF-8 Datei für die Anzeige in einem Textprogramm, für Excel oder für Outlook-Adressimport. Ist das irgendwie Möglich oder nur ein Wunschtraum von mir?
Die Daten kommen aus eine MySQL-DB deren "Zeichensatz / Kollation der MySQL-Verbindung" auf utf8_general_ci eingestellt sind und werden mit PHP an den Browser geschickt:
----------
$csv = implode(NL, $csv);
header('Content-Type: text/plain; charset=utf-8');
header("Content-Type: application/force-download");
header('Content-Length: '.strlen($csv));
header('Content-Disposition: attachment; filename="'.$fname.'"');
print $csv;
exit;
----------
$csv enthält die Zeichen "ßüä+ěš"
Folgende Ansätze habe ich gefunden und probiert:
$csv = implode(NL, $csv);
-> Browser: OK, wenn man die Zeichenkodierung auf UTF8 setzt.
-> Excel: kryptisch
-> Outlook: kryptisch
$csv = utf8_decode(implode(NL, $csv));
-> Browser: OK, wenn man die Zeichenkodierung auf ISO-8859-1 setzt. Nur werden die letzen beiden Tschechischen Zeichen nicht erkannt.
-> Excel: kryptisch
-> Outlook: Wie Browser
$csv = "\xEF\xBB\xBF".implode(NL, $csv);
-> Browser: OK, Zeichenkodierung wird erkannt.
-> Excel: kryptisch und "\xEF\xBB\xBF" wird angezeigt
-> Outlook: kryptisch und "\xEF\xBB\xBF" wird angezeigt
$csv = chr(255).chr(254).mb_convert_encoding(implode(NL, $csv), 'UTF-16LE', 'UTF-8');
-> Browser: OK, Zeichenkodierung wird erkannt und auf UTF-16 gesetzt.
-> Excel: OK
-> Outlook: wird nicht angezeigt
Hat damit jemand Erfahrung?
lg lixx
echo $begrüßung;
Was ich gerne hätte ist eine Art universelle UTF-8 Datei für die Anzeige in einem Textprogramm, für Excel oder für Outlook-Adressimport. Ist das irgendwie Möglich oder nur ein Wunschtraum von mir?
Das Problem ist nicht die Datei sondern dass die verarbeitenden Programme wissen müssen, in welcher Kodierung der Inhalt vorliegt.
Die Daten kommen aus eine MySQL-DB deren "Zeichensatz / Kollation der MySQL-Verbindung" auf utf8_general_ci eingestellt sind und werden mit PHP an den Browser geschickt:
Du scheinst phpMyAdmin zu verwenden. Allerdings gilt diese Angabe nur für den phpMyAdmin. Interessant ist im Prinzip auch nicht, in welcher Kodierung sich dein Script mit dem MySQL unterhält, sondern die Kodierung, in der es die Daten an die weiterverarbeiten Programme weitergibt und die Angabe, welche Kodierung das sei.
$csv = implode(NL, $csv);
Diese Zeile ist für das Verständnis deines Problems nicht interessant.
header('Content-Type: text/plain; charset=utf-8');
Dese Zeile ist in Ordnung, aber nur für den Browser interessant. Die anderen Zeilen sind für den Problem ebenfalls irrelevant.
$csv enthält die Zeichen "ßüä+ěš"
Interessanter wäre, in welcher Kodierung der Inhalt vorliegt. Notfalls sind die Byte-Werte zu Rate zu ziehen (Die Funktionen bin2hex() oder auch url_encode() helfen bei der Darstellung).
-> Browser: OK, wenn man die Zeichenkodierung auf UTF8 setzt.
Mit dem oben angeführten charset-Angabe sollte der Browser selbständig diese Kodierung zum Dekodieren der ankommenden Daten verwenden, und, falls die Angabe mit der tatsächlich verwendeten Kodierung übereinstimmt, die richtigen Zeichen darstellen (falls er auch noch die richtigen Glyphen in seinen Schriftarten findet.)
-> Excel: kryptisch
-> Outlook: kryptisch
"kryptisch" ist keine Aussage, mit der man etwas anfangen kann. Was genau zeigen die Beteiligten an? Und wie übergibst du die Daten an die beiden Programme?
$csv = utf8_decode(implode(NL, $csv));
-> Browser: OK, wenn man die Zeichenkodierung auf ISO-8859-1 setzt. Nur werden die letzen beiden Tschechischen Zeichen nicht erkannt.
Ja, logisch, diese beiden Zeichen gibt es nicht in ISO-8859-1.
$csv = "\xEF\xBB\xBF".implode(NL, $csv);
-> Browser: OK, Zeichenkodierung wird erkannt.
Er erkennt sie aus dem HTTP-Header, nicht aus dieser Angabe.
$csv = chr(255).chr(254).mb_convert_encoding(implode(NL, $csv), 'UTF-16LE', 'UTF-8');
-> Browser: OK, Zeichenkodierung wird erkannt und auf UTF-16 gesetzt.
Wenn du keine Angaben im HTTP-Header machst, darf der Browser auch raten. Hast du eine, darf er das nicht. Der IE macht es manchmal trotzdem. Welchen Browser verwendest du überhaupt?
echo "$verabschiedung $name";
Meine Erfahrung mit CSV-Dateien:
Excel nimmt einfach immer den Zeichensatz Windows-1252 (Latin1), egal welcher Zeichensatz in der Datei benutzt wird.
Dadurch werden je nach Zeichensatz der Datei Zeichen falsch dargestellt. (Wenn die Datei z.B. UTF-8 werden Sonderzeichen wie z.B. Umlaute falsch angezeigt)
Bei OpenOffice kommt beim Öffnen ein Dialogfeld, wo man den Zeichensatz auswählen kann.
Na ja, dann verwende ich halt 8859-1. Für die slavischen Zeichensätze muß ich mir dann halt die Auswahl der Kodierung dem Benutzer überlassen.
Danke für eure Hilfe!
lg lixx