dedlfix: Datei als UTF-8

Beitrag lesen

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