php: benutze DomDocument, wenn ich versuche, UTF-8 zu schreiben, schreibt es die hexadezimale Schreibweise davon

8

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?

    
ufk 26.08.2010, 12:40
quelle

6 Antworten

14

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.

    
Gordon 26.08.2010, 13:08
quelle
5

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:

  • UTF-8 wird immer verwendet. In PCDATA werden nur einige Entitäten verwendet, es sei denn, die UTF-8-Codierung ist angegeben. Wenn eine andere Codierung als UTF-8 angegeben ist, gelten andere Regeln .
  • Sie können nicht angeben, ob Sie Entities verwenden möchten oder nicht, indem Sie ein XML-Dokument als UTF-8-codierte Zeichenfolge in PHP DOMDocument per se laden. Nicht einmal mit libxml Flags oder durch das Bereitstellen einer BOM. [1]
  • Sie können angeben, dass Sie keine Entitäten verwenden möchten, indem Sie die Dokumentcodierung auf UTF-8 setzen.
  • Wenn dies möglich ist, können Sie die Eingabezeichenfolge mit einer XML-Deklaration bearbeiten, in der die Dokumente angegeben werden, die wie in Gordons Antwort codiert sind >.
  

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.

    
hakre 03.05.2013 13:38
quelle
3

Offenbar übergeben Sie das documentElement als $ node an saveXML, obwohl ich nicht sagen kann, warum.

z.B.

%Vor%

anstatt:

%Vor%

Quelle: Ссылка

    
Paul Annesley 26.08.2010 12:52
quelle
0

Als ich das DomDocument zum Schreiben erstellt habe, habe ich die folgenden Parameter hinzugefügt:

%Vor%

Diese Parameter haben dazu geführt, dass die UTF-8-Zeichenfolge unverändert geschrieben wurde.

    
ufk 26.08.2010 13:04
quelle
0
%Vor%     
ram4nd 25.03.2013 09:56
quelle
0

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.

    
Nabeel Khan 17.12.2015 01:54
quelle

Tags und Links