Heim > Artikel > Backend-Entwicklung > Warum kann DOMDocument beim Laden von HTML UTF-8-Zeichen nicht korrekt verarbeiten?
DOMDocument kann UTF-8-Zeichen nicht verarbeiten
In einem Szenario, in dem ein Webserver Antworten mit UTF-8-Codierung überträgt, gilt dies für alle Dateien ebenfalls in UTF-8 gespeichert und alle relevanten Einstellungen für die UTF-8-Kodierung konfiguriert wurden, tritt ein Problem auf. Ein Testprogramm zur Überprüfung der Ausgabefunktion zeigt unregelmäßiges Verhalten.
Bei der Ausführung des Programms wird die Ausgabe wie folgt gerendert:
<!DOCTYPE html> <html><head><meta charset="utf-8"><title>Test!</title></head><body> <h1>☆ Hello ☆ World ☆</h1> </body></html>
was wie folgt aussieht:
< ;h1>☆ Hallo ☆ Welt ☆
Das Programm:
<code class="php">$html = <<<HTML <!doctype html> <html> <head> <meta charset="utf-8"> <title>Test!</title> </head> <body> <h1>☆ Hello ☆ World ☆</h1> </body> </html> HTML; $dom = new DOMDocument("1.0", "utf-8"); $dom->loadHTML($html); header("Content-Type: text/html; charset=utf-8"); echo($dom->saveHTML());</code>
Die zugrunde liegende Ursache ist, dass DOMDocument::loadHTML() erwartet einen String im HTML-Format. HTML verwendet standardmäßig ISO-8859-1 (ISO Latin Alphabet No. 1) als Standardzeichenkodierung. Wenn ein für HTML 4.0 entwickelter HTML-Parser auf Zeichen stößt, die diese Codierung überschreiten, kann es daher zu unvorhersehbarem Verhalten kommen.
Nicht-ASCII-Zeichen in Entitäten konvertieren
Um dieses Problem zu beheben, sollten alle Zeichen außerhalb des ASCII-Bereichs (127 / h7F) konvertiert werden in HTML-Entitäten. Dieser Prozess kann durch den Einsatz von mb_convert_encoding mit der HTML-ENTITIES-Zielkodierung erreicht werden:
<code class="php">$html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8");</code>
Hinzufügen eines Inhaltstyp-Meta-Tags
Alternativ kann das Problem gelöst werden durch Einbinden eines Tag in das Dokument selbst ein und gibt den Zeichensatz als UTF-8 an:
<code class="html"><meta http-equiv="content-type" content="text/html; charset=utf-8"></code>
Diese Methode dient als Hinweis für das DOMDocument und zwingt es dazu, die Eingabe als UTF-8-codiert zu interpretieren. Selbst wenn es außerhalb des
Das obige ist der detaillierte Inhalt vonWarum kann DOMDocument beim Laden von HTML UTF-8-Zeichen nicht korrekt verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!