Will Mensch eine „UTF-8“ Datei mit PHP’s eigener fopen-Funktion erzeugen, muss er nur ein paar Dinge beachten.
Zum einen muss der jeweilige Inhalt des fwrite-Befehl UTF-8 encoded sein; das erreicht man am sichersten über die Funktion mb_convert_encoding.
Dann erzeugt man das File auf jeden Fall mit dem ‚b‘ Parameter, sicher ist sicher.
Als letztes setzt Mensch in der Datei noch die entsprechende „Byte Order Mark“ hinein. Das passiert mit Hilfe des pack-Kommandos.
Letztendlich kann man dann seinen Content in die Datei schreiben.
$content = mb_convert_encoding($content,'UTF-8');
$fHandle = fopen($filename,'wb');
fwrite($fHandle, pack("CCC",0xef,0xbb,0xbf));
fwrite($fHandle, $content);
fclose($fHandle);
P.S.: Nicht das fclose vergessen, das wäre einfach schlechter Stil 😉
Schöne Sache, gleich mal ausprobieren 🙂
Ist ja alles schön, aber dann muß man auch exakt wissen, in welchem Encoding der Content denn derzeit eigentlich vorliegt: Füttert man den oben gezeigten Aufruf von mb_convert_encoding mit einem String, der bereits in UTF-8 kodiert ist, ist im Anschluss das Encoding schlicht kaputt.
Meiner Erfahrung nach sollte man unnötigen Konvertierungen von Encodings so weit wie möglich aus dem Weg gehen. Es gibt einfach keinen guten Grund, warum man nicht von Vornherein durchgängig mit UTF-8 arbeiten sollte. Dann entfallen diese ganzen Verrenkungen – aufpassen muß man dann nur, daß man nicht fahrlässig Funktionen wie strlen benutzt, die immer von exakt einem Byte pro Zeichen ausgehen, sondern wie mbstring-Äquivalente benutzt.
Einzig bei Datenim- und Exporten aus Fremdquellen braucht man dann u.U. noch eine Konvertierung des Encodings – und da heißt es bei Importen dann entweder, dem Anwender – wenn möglich – ein Encoding vorgeben, das einzuhalten ist, oder Methoden zur automatischen Erkennung wie mb_detect_encoding einzusetzen – was aber leider nicht immer zuverlässig funktioniert.
@Markus: Du hast recht, aber wie immer gebe ich hier vereinfachte Beispiele an, damit man sich der Materie nähern kann. Der Profi indess wird sich eine Funktion bauen und dort natürlich via mb_detect_encoding die Kodierung vorher abfragen und entsprechend reagieren.
Und die Sache mit strlen usw. ist mir auch schon passiert, seitdem benutze ich eigentlich ständig Wrapper-Klassen und -Funktionen, die mir die Arbeit mit Encodings sehr vereinfachen.
Alter Bezirksverwalter!
Das hat mir total geholfen. Meine xml Datei wird nun UTF-8 Codiert.
Ebenfalls tolle Artikel über Programmierung habe ich auf http://www.killoverhead.com gefunden!
Mfg
Vielen Dank für den Tipp mit dem BOM! Nun ist meine XML auch korrekt im UTF-8 Format. 🙂