Wenn ich versuche, UTF-8-Strings mit DomDocument in eine XML-Datei zu schreiben, schreibt es tatsächlich die hexadezimale Schreibweise der Zeichenfolge anstelle der Zeichenfolge selbst.
zum Beispiel:
ירושלים
anstelle von: ירשששםם
irgendwelche Ideen, wie man das Problem löst?
Ok, hier gehts:
%Vor%funktioniert einwandfrei, da das von Ihnen erstellte Dokument in diesem Fall die Codierung als zweites Argument enthält:
%Vor%Sobald Sie jedoch XML in ein Dokument laden, das keine Codierung angibt, verlieren Sie alles, was Sie im Konstruktor deklariert haben, was bedeutet:
%Vor%wird keine Codierung von utf-8 haben:
%Vor%Wenn Sie also etwas laden, stellen Sie sicher, dass es
ist %Vor%und es wird wie erwartet funktionieren.
Als Alternative können Sie auch die Kodierung angeben Laden des Dokuments.
Wenn Sie UTF-8 mit DOMDocument ausgeben möchten, müssen Sie dies angeben. Einfach, nicht wahr? Wenn Sie schon eine Trickfrage riechen, sind Sie nicht zu weit weg, aber auf den ersten Blick ist es wirklich einfach.
Betrachten Sie das folgende (UTF-8-codierte) Codebeispiel, das hexadezimale Entitäten ausgibt:
%Vor%Ausgabe:
%Vor%Wie geschrieben, wenn Sie dies als UTF-8 ausgeben möchten, müssen Sie es angeben, und es ist einfach:
%Vor%Die Ausgabe ist dann in UTF-8 explizit :
%Vor%So viel für den direkten Teil. Wenn Sie an den schmutzigen kleinen Details interessiert sind, können Sie weiter lesen - wenn nicht, bitte fragen Sie nicht warum :).
Ich habe gerade "in UTF-8 explizit " geschrieben, weil auch im ersten Beispiel die Ausgabe UTF-8-kodiert ist, die XML nur hexadezimale Entitäten enthielt, was perfekt ist gültig - auch in UTF-8!
Sie bemerken bereits, dass ich hier mit dem Nit-Picking beginne, aber denken Sie daran: UTF-8 ist die Standardcodierung von XML .
Und wenn Sie nun anfangen zu sagen: Hey, warte, wenn die Standardcodierung sowieso UTF-8 ist, warum benutzt PHPs DOMDocument die Entitäten an erster Stelle?
Nun, die Wahrheit ist, dass es nicht im Widerspruch zu dem Ergebnis in der Frage steht. Nicht immer .
Siehe das folgende Beispiel, das anstelle eines Knotenwerts, der die Ivrit-Buchstaben enthält, einen XML-Kommentar verwendet:
%Vor%Ausgabe:
%Vor%Okay, alles klar? Das schmutzige kleine Geheimnis hier ist also: Ob Sie diese XML-Entitäten dort haben oder nicht - für das Dokument macht es keinen Unterschied, es ist nur eine andere Form des Schreibens derselben XML-Zeichendaten. Und Sie fühlen sich bereits eingeladen: Versuchen Sie CDATA stattdessen für das erste Beispiel:
%Vor%Ausgabe:
%Vor%Wie bereits im XML-Kommentar-Beispiel gezeigt, werden hier keine XML-Entitäten verwendet. Nun, sie wären sowieso nicht gültig, wie beim Beispiel XML-Kommentar.
Für die Übersicht erstellen Sie ein Beispiel, das all diese enthält:
%Vor%Ausgabe:
%Vor%Lessons Learned:
Tipp: Wenn Ihre Zeichenfolge eine XML-Deklaration enthält, die nicht mit der Zeichenfolgencodierung übereinstimmt oder wenn Sie beide vor dem Laden von ändern möchten Zeichenfolge in DOMDocument Sie müssen die XML-Deklaration ändern und / oder die Zeichenfolge neu codieren. Dies wurde in einer Antwort auf die Frage PHP XMLReader, erhalten Sie die Version und Codierung , indem Sie zeigen, wie die
XMLRecoder
-Klasse funktioniert.
Und das ist es hoffentlich.
[1] Wahrscheinlich, wenn Sie von einer HTTP-Anfrage laden und Sie den Stream-Kontext bereitstellen und die Zeichencodierung über Meta-Daten kennzeichnen - aber das sollte zuerst getestet werden, weiß ich nicht. Dass die Stückliste nicht funktioniert, ist ein Zeichen dafür, dass all diese Dinge nicht funktionieren.
Offenbar übergeben Sie das documentElement als $ node an saveXML, obwohl ich nicht sagen kann, warum.
z.B.
%Vor%anstatt:
%Vor%Quelle: Ссылка
Auf den Punkt Antwort ist:
Wenn Ihre Funktion beginnt, direkt nachdem Sie den Inhalt erhalten haben, tun Sie dies:
%Vor%Und dann starten Sie das neue Dokument usw. Überprüfen Sie dies als Beispiel:
%Vor%Dann tu alles, was du mit deinem Code machen wolltest.
Tags und Links php utf-8 hebrew domdocument