Hallo,
Das angegebene Skript im Anfangsposting, nimmt zu Testzwecken keine Daten aus der DB. Ich habe dort ein neues Element einfach so angelegt mit
$dom->createElement('title', 'Sofortmaßnahmen');
. Liegt das jetzt am CharacterSet meines Skripts? Wie stellt man das da ein?
Ja, liegt es! Es ist vermutlich ISO-8859-1-kodiert, das ist ein Problem.
Wenn du das Script im Editor speicherst, erlaubt dir der Editor meist, die Kodierung zu wählen, in der gespeichert werden soll.
Eigentlich sage ich doch bei der Erstellung des neuen XML-Dokuments: sei iso-8859-1. Das sollte ihm doch reichen, oder?
Nein, das ist anscheinend so:
- Intern verwendet das PHP-DOM immer UTF-8 (bzw. richtig intern wohl UTF-16 o.ä.), egal was du für ein encoding setzt. Die gesetzte encoding wird bei der Arbeit mit dem DOM überhaupt nicht beachtet.
- Wenn du Daten ins DOM einbringst, muss dies *immer* in UTF-8 geschehen. Wenn du Daten aus dem DOM holst, sind die *immer* UTF-8 kodiert. (Meiner Erfahrung nach. Vielleicht kann man es irgendwie ändern, jedenfalls nicht mit $dom->encoding.)
- Die encoding wird nur dann beachtet, wenn du das Dokument serialisierst. Dann werden die Zeichen automatisch in die angegebene Kodierung umgewandelt.
Das heißt:
- Es ist okay, wenn du aus der Datenbank rohe UTF-8-Daten bekommst. Die kannst du problemlos direkt ins DOM schreiben. Entity-Maskierung solltest du dann natürlich lassen.
- Das Serialisieren nach ISO-8859-1 sollte dann auch klappen.
- PHP-Scripte, die mit dem DOM arbeiten und selbst hartkodierte Zeichendaten enthalten, sollten allesamt UTF-8-kodiert sein. Konkret, wenn du ein Script mit einem String mit Umlauten drin hast und die in ein DOM montieren willst, so darf das Script nicht ISO-8859-1-kodiert sein.
- Die Anweisung $dom->encoding = 'iso-8859-1'; ist überhaupt nicht maßgeblich dafür, in welcher Kodierung Daten von den DOM-Methoden entgegengenommen werden. Diese Anweisung muss nicht vor allen anderen Operationen stehen, sie kann auch direkt vor dem saveXML()-Aufruf stehen, das hat denselben Effekt.
Beispiel in ASCII mit Escape-Sequenzen:
// ISO-8859-1-kodiertes ß im String
$title = $dom->createElement('title', "Sofortma\xDFnahmen");
// Führt immer zu einem Fehler!
// UTF-8-kodiertes ß im String
$title = $dom->createElement('title', "Sofortma\xC3\x9Fnahmen");
// Funktioniert unabhängig vom letztlichen encoding des serialisierten Dokuments
Mathias