Ich versuche, HTML mit DOMDocument zu analysieren, aber wenn ich das tue, verliere ich plötzlich meine Codierung (zumindest erscheint es mir so).
$profile = "<div><p>various japanese characters</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $div) {
echo $dom->saveHTML($div);
}
Das Ergebnis dieses Codes ist, dass ich eine Reihe von Zeichen bekomme, die nicht japanisch sind. Wenn ich es jedoch tue:
echo $profile;
es wird korrekt angezeigt. Ich habe saveHTML und saveXML ausprobiert und beide werden nicht richtig angezeigt. Ich benutze PHP 5.3.
Was ich sehe:
ã¤ãªãã¤å·ã·ã«ã´ã«ã¦ãã¢ã¤ã«ã©ã³ãç³»ã®å®¶åºã«ã9人åå¼ã®5çªç®ã¨ãã¦çã¾ãããå½¼ãå«ãã¦4人ã俳åªã«ãªã£ããç¶è¦ªã¯æ¨æã®ã»ã¼ã«ã¹ãã³ã§ãæ¯è¦ªã¯éµä¾¿å±ã®å®¢å®¤ä¿ã ã£ããé«æ ¡æ代ã¯ãã£ãã£ã®ã¢ã«ãã¤ãã«å¤ãã¿ãæè²è³éãåããªããã«ããªãã¯ç³»ã®é«æ ¡ã¸é²å¦ã
Was sollte gezeigt werden:
イリノイ州シカゴにて、アイルランド系の家庭に、9人兄弟の5番目として生まれる。彼を含めて4人が俳優になった。父親は木材のセールスマンで、母親は郵便局の客室係だった。高校時代はキャディのアルバイトに勤しみ、教育資金を受けながらカトリック系の高校へ進学
BEARBEITEN: Ich habe den Code auf fünf Zeilen vereinfacht, damit Sie ihn selbst testen können.
$profile = "<div lang=ja><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
echo $dom->saveHTML();
echo $profile;
Hier ist das HTML, das zurückgegeben wird:
<div lang="ja"><p>イリノイ州シカゴã«ã¦ã€ã‚¢ã‚¤ãƒ«ãƒ©ãƒ³ãƒ‰ç³»ã®å®¶åºã«ã€</p></div>
<div lang="ja"><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>
php
utf-8
character-encoding
Etwas A.
quelle
quelle
Antworten:
DOMDocument::loadHTML
behandelt Ihre Zeichenfolge als ISO-8859-1, sofern Sie nichts anderes angeben. Dies führt dazu, dass UTF-8-Zeichenfolgen falsch interpretiert werden.Wenn Ihre Zeichenfolge keine XML-Codierungsdeklaration enthält, können Sie eine voranstellen, damit die Zeichenfolge als UTF-8 behandelt wird:
Wenn Sie nicht wissen können, ob die Zeichenfolge bereits eine solche Deklaration enthält, gibt es in SmartDOMDocument eine Problemumgehung, die Ihnen helfen sollte:
Dies ist keine gute Problemumgehung, aber da nicht alle Zeichen in ISO-8859-1 (wie diese Katana) dargestellt werden können, ist dies die sicherste Alternative.
quelle
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
hat es für mich in PHP7 behoben (es ist also immer noch ein Problem) - dies ist ein wirklich ärgerliches Problem, da ich utf8 im HTML-Dokument (mit<meta charset="UTF-8" />
) definiert habe, aber das hat keine Auswirkung, es scheint den <? xml-Teil zu benötigen, der ist völlig unintuitiv.$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
funktioniert super! Vielen Dank,Das Problem liegt bei
saveHTML()
undsaveXML()
beide funktionieren unter Unix nicht richtig. Sie speichern UTF-8-Zeichen unter Unix nicht korrekt, funktionieren jedoch unter Windows.Die Problemumgehung ist sehr einfach:
Wenn Sie die Standardeinstellung ausprobieren, wird der von Ihnen beschriebene Fehler angezeigt
Sie müssen lediglich wie folgt speichern:
In dieser Codezeile werden Ihre UTF-8-Zeichen korrekt gespeichert. Verwenden Sie dieselbe Problemumgehung, wenn Sie verwenden
saveXML()
.Aktualisieren
Wie von " Jack M " im Kommentarbereich unten vorgeschlagen und von " Pamela " und " Marco Aurélio Deleu " verifiziert , könnte die folgende Variante in Ihrem Fall funktionieren:
Hinweis
Englische Zeichen verursachen keine Probleme, wenn Sie sie
saveHTML()
ohne Parameter verwenden (da englische Zeichen in UTF-8 als Einzelbytezeichen gespeichert werden).Das Problem tritt auf, wenn Sie Multibyte-Zeichen haben (z. B. Chinesisch, Russisch, Arabisch, Hebräisch usw.).
Ich empfehle diesen Artikel zu lesen: http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/ . Sie werden verstehen, wie UTF-8 funktioniert und warum Sie dieses Problem haben. Es dauert ungefähr 30 Minuten, aber es ist gut investierte Zeit.
quelle
$str = utf8_decode($dom->saveHTML($dom->documentElement));
utf8_decode($dom->saveHTML($dom->documentElement));
habe es perfekt für mich gemacht.Stellen Sie sicher, dass die echte Quelldatei als UTF-8 gespeichert ist (Sie können sogar die nicht empfohlenen Stücklistenzeichen mit UTF-8 ausprobieren, um dies sicherzustellen).
Stellen Sie auch bei HTML sicher, dass Sie die richtige Codierung mithilfe von
meta
Tags deklariert haben :Wenn es sich um ein CMS handelt (da Sie Ihre Frage mit Joomla markiert haben), müssen Sie möglicherweise die entsprechenden Einstellungen für die Codierung konfigurieren.
quelle
<meta charset="UTF-8">
Nebenbei bemerkt, das neuere Tag funktioniert nicht mit DOMDocument.Sie können einer Zeile, die die
utf-8
Codierung erzwingt, Folgendes voranstellen :Und Sie können dann mit dem Code fortfahren, den Sie bereits haben, wie:
quelle
Ich habe eine Weile gebraucht, um das herauszufinden, aber hier ist meine Antwort.
Bevor ich DomDocument verwende, verwende ich file_get_contents, um URLs abzurufen und sie dann mit Zeichenfolgenfunktionen zu verarbeiten. Vielleicht nicht der beste Weg, aber schnell. Nachdem ich überzeugt war, dass Dom genauso schnell war, versuchte ich zuerst Folgendes:
Dies scheiterte spektakulär daran, die UTF-8-Codierung trotz der richtigen Meta-Tags, PHP-Einstellungen und aller anderen hier und anderswo angebotenen Mittel beizubehalten. Folgendes funktioniert:
usw. Jetzt stimmt alles mit der Welt. Hoffe das hilft.
quelle
DomDocument('1.0', 'UTF-8')
. In meinem Fall wird aber nur teilweise HTML geladen.Sie müssen dem DOMDocument eine Version Ihres HTML-Codes mit einem sinnvollen Header zuführen. Genau wie HTML5.
Vielleicht ist es eine gute Idee, Ihr HTML so gültig wie möglich zu halten, damit Sie nicht in Probleme geraten, wenn Sie mit der Abfrage beginnen ... herum :-) und sich von
htmlentities
!!!! fernhalten !!!! Das ist ein notwendiges Hin und Her, um Ressourcen zu verschwenden. Halte deinen Code verrückt !!!!quelle
Ich benutze PHP 7.3.8 auf einem Manjaro und habe mit persischen Inhalten gearbeitet. Dies löste mein Problem:
quelle
Werke finden für mich:
quelle
?
)Verwenden Sie es für das richtige Ergebnis
Diese Operation
Es ist ein schlechter Weg, weil spezielle Symbole wie & lt; , & gt; kann sich in $ profile befinden und wird nach mb_convert_encoding nicht zweimal konvertiert. Es ist das Loch für XSS und falsches HTML.
quelle
Das einzige, was für mich funktioniert hat, war die akzeptierte Antwort von
JEDOCH
Dies brachte neue Probleme mit sich, die
<?xml encoding="utf-8" ?>
in der Ausgabe des Dokuments enthalten waren.Die Lösung für mich war dann zu tun
Einige Lösungen sagten mir
xml
, dass ich ausführen musste, um den Header zu entfernenDies funktionierte bei mir nicht wie bei einem Teildokument (z. B. einem Dokument mit zwei
<p>
Tags), nur eines der<p>
Tags wurde zurückgegeben.quelle
Das Problem ist, dass Sie die Codierung verlieren, wenn Sie der Funktion DOMDocument :: saveHTML () Parameter hinzufügen. In einigen Fällen müssen Sie die Verwendung des Parameters vermeiden und die alte Zeichenfolgenfunktion verwenden, um zu finden, wonach Sie suchen.
Ich denke, die vorherige Antwort funktioniert für Sie, aber da diese Problemumgehung für mich nicht funktioniert hat, füge ich diese Antwort hinzu, um Personen zu helfen, die möglicherweise in meinem Fall sind.
quelle
Kann auch wie unten codiert werden .... gesammelt von https://davidwalsh.name/domdocument-utf8-problem
quelle