DOMDocument mag Sonderzeichen nicht
Leeloo5E
- php
Hallo,
Ich bastele mir grad in PHP ein XML-Dokument. Das klappt recht gut, bis auf eine Sache: Sonderzeichen verhindern die Darstellung des XML-Dokuments. Da hab ich mir gedacht, ich nehme htmlentities() und maskiere die Inhalte halt so. Aus ß wird so halt ß.
Das XML-Dokument wird damit korrekt erstellt. Im nächsten Schritt wird mit XSL ein HTML-Dokument erstellt und dieses verschluckt das ß bzw. ß ist nicht mehr da. "Sofortmaßnahmen" wird also zu "Sofortmanahmen".
Nun werdet ihr sagen: "Du brauchst eine Encodierung". Die Sache ist, ich hab die ja angegeben beim Erstellen des neuen XML-Dokuments mit DOM.
Ich gehe wie folgt vor:
// Creates an instance of the DOMImplementation class
$imp = new DOMImplementation;
// Creates a DOMDocumentType instance
$dtd = $imp->createDocumentType('article', '', 'sdocbook.dtd');
// Creates a DOMDocument instance
$dom = $imp->createDocument("", "", $dtd);
// Set encoding
$dom->encoding = 'iso-8859-1';
// Create an the root element
$article = $dom->createElement('article');
// Set an Attribute for root element
$article->setAttribute('lang', 'de');
// Append the root element
$dom->appendChild($article);
// Create Title Element
$title = $dom->createElement('title', 'Sofortmaßnahmen');
$article->appendChild($title);
// Create SubTitle Element
$subtitle = $dom->createElement('subtitle', 'Untertitel');
$article->$dom->appendChild($subtitle);
//Output created XML
echo $dom->saveXML();
Ja, und die Ausgabe sollte so aussehen, wegen dem "ß" in Sofortmaßnahmen meckert DOM jedoch rum und macht ab dem Zeichen nicht mehr weiter.
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article SYSTEM "sdocbook.dtd">
<article lang="de">
<title>Sofortmaßnahmen</title>
<subtitle>Untertitel</subtitle>
</article>
In der DTD sind alle Sonderzeichen als Entities angegeben, so dass sie eigentlich akzeptiert werden sollten.
Das XSL zur Weitervearbeitung und Anzeige des XML als HTML ist ebenso in iso-8859-1. Stellt aber diese htmlentities-Darstellung der Sonderzeichen nicht da. Warum? Wieso werden die übergangen?
Als Zwischenschritt mach ich nun folgendes:
$myxml = $dom->saveXML();
$myxml = html_entity_decode($myxml);
$xml = new DOMDocument();
$xml->resolveExternals = true;
$xml->loadXML($myxml);
echo $xml->saveXML();
Damit werden die dekodierten HTMLEntities wieder in gewöhnliche Sonderzeichen umgewandelt und im Browser nach erfolgter XSL-Transformation korrekt angezeigt.
Gruß,
Leeloo
hi,
Nun werdet ihr sagen: "Du brauchst eine Encodierung". Die Sache ist, ich hab die ja angegeben beim Erstellen des neuen XML-Dokuments mit DOM.
Und die Daten, die du ins Dokument einfügst, liegen auch in dieser Kodierung vor?
gruß,
wahsaga
Hallo,
Nun werdet ihr sagen: "Du brauchst eine Encodierung". Die Sache ist, ich hab die ja angegeben beim Erstellen des neuen XML-Dokuments mit DOM.
Und die Daten, die du ins Dokument einfügst, liegen auch in dieser Kodierung vor?
hm ... gute Frage. Die liegen in der Datenbank und die interessierst nicht, ob da nun ß oder ß steht. Deshalb geh ich da mit htmlentities oder html_entity_decode ran.
Gruß,
Leeloo
hi,
Und die Daten, die du ins Dokument einfügst, liegen auch in dieser Kodierung vor?
hm ... gute Frage. Die liegen in der Datenbank und die interessierst nicht, ob da nun ß oder ß steht.
Das hat ja auch nichts mit der Zeichenkodierung zu tun.
Also suche erst mal die Antwort auf die "gute Frage".
gruß,
wahsaga
Hallo,
Das hat ja auch nichts mit der Zeichenkodierung zu tun.
Also suche erst mal die Antwort auf die "gute Frage".
Gibst du mir auch einen Tipp, wo ich da suchen soll! Bitte.
Gruß,
Leeloo
Hell-O!
Also suche erst mal die Antwort auf die "gute Frage".
Gibst du mir auch einen Tipp, wo ich da suchen soll! Bitte.
In den Feld- bzw. Spalteneinstellungen der Datenbank. Stelle auch sicher, dass Datenbank und Script in der selben Codierung kommunizieren. Genaueres kann man nur sagen, wenn du uns das verwendete DBMS nebst Version nennst.
Siechfred
Hallo,
In den Feld- bzw. Spalteneinstellungen der Datenbank. Stelle auch sicher, dass Datenbank und Script in der selben Codierung kommunizieren. Genaueres kann man nur sagen, wenn du uns das verwendete DBMS nebst Version nennst.
Hey, guter Tipp. Mein phpMyAdmin zeigt mir das ja och an. Der sagt:
Und bei den Variablen, ist UTF-8 für character set client, character set results und character set server angegeben. Ich denke mal daran liegts. Mal schaun, müsst ich ja irgendwo ändern können. Ich hoffe, dass klappt dann auch.
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? Eigentlich sage ich doch bei der Erstellung des neuen XML-Dokuments: sei iso-8859-1. Das sollte ihm doch reichen, oder? Das Dokument, wird am Ende zusammengebastelt $dom->saveXML();
in eben diesem Zeichensatz und das kann doch bekanntlich ü's, ä's oder ö's sowie das ß.
Gruß,
Leeloo
Hallo,
dumm, dass man seine eigenen Threads nicht bearbeiten kann, um z.B. Text hinzuzufügen, weil man noch was vergessen hat.
Meine derzeitige MySQL-Version: 5.0.24a.
Und bei den Variablen, ist UTF-8 für character set client, character set results und character set server angegeben. Ich denke mal daran liegts. Mal schaun, müsst ich ja irgendwo ändern können. Ich hoffe, dass klappt dann auch.
So, mal eben in die mysql.cnf geschaut. Da steht merkwürdigerweise für character-set-server: latin1. phpMyAdmin zeigt mir eben utf-8
Gruß,
Leeloo
echo $begrüßung;
dumm, dass man seine eigenen Threads nicht bearbeiten kann, um z.B. Text hinzuzufügen, weil man noch was vergessen hat.
Dumm wäre es, wenn ich die unkorrigierte Version gelesen, mich darauf bezogen hätte und dann dieser Bezug verschwindet. Das stiftet mehr Verwirrung als es nützt.
Und bei den Variablen, ist UTF-8 für character set client, character set results und character set server angegeben. Ich denke mal daran liegts. Mal schaun, müsst ich ja irgendwo ändern können. Ich hoffe, dass klappt dann auch.
So, mal eben in die mysql.cnf geschaut. Da steht merkwürdigerweise für character-set-server: latin1. phpMyAdmin zeigt mir eben utf-8
Schau bitte nochmal genau hin, was der phpMyAdmin anzeigt. Die Werte der Defaulteinstellungen des Servers können von den für die aktuelle Session eingestellten Werten abweichen. Session-Werte, die der PMA anzeigt sind für andere Clients nicht weiter interessant, die haben ihre eigenen Werte in ihrer Session.
Die einfachste Lösung ist, nach dem Connect ein SET NAMES latin1 oder SET NAMES utf8 an den Server zu senden, um für beide Seiten verbindlich festzulegen, in welcher Zeichenkodierung die Kommunikation zwischen Client und Server zu erfolgen hat.
Zu Hintergründen kannst du das MySQL-Handbuch-Kapitel Character Set Support lesen (und auch das hiesige Archiv befragen).
echo "$verabschiedung $name";
Hallo,
Vielen Dank.
Zu Hintergründen kannst du das MySQL-Handbuch-Kapitel Character Set Support lesen (und auch das hiesige Archiv befragen).
Hab ich beides bereits gemacht.
Gruß,
Leeloo
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:
Das heißt:
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
Hallo Matthias,
Vielen Dank für die ausführliche Beschreibung. Jetzt ist doch einiges klarer.
Gruß,
Leeloo