Maison > Article > développement back-end > Pourquoi DOMDocument a-t-il du mal avec les caractères UTF-8 et comment y remédier ?
DOMDocument lutte avec les caractères UTF-8 : une enquête approfondie
DOMDocument, une bibliothèque en PHP, est conçue pour gérer le HTML, qui est intrinsèquement utilise le codage ISO-8859-1. Cependant, lorsque vous tentez de charger du HTML codé en UTF-8 dans une instance DOMDocument, la sortie résultante peut présenter des caractères utf-8 corrompus.
Le problème :
L'exemple Le code fourni tente de charger la chaîne HTML codée en UTF-8 suivante :
<code class="html"><html> <head> <meta charset="utf-8"> <title>Test!</title> </head> <body> <h1>☆ Hello ☆ World ☆</h1> </body> </html></code>
Cependant, la sortie contient des entités HTML au lieu des caractères prévus :
<code class="html"><!DOCTYPE html> <html><head><meta charset="utf-8"><title>Test!</title></head><body> <h1>&acirc;&#152;&#134; Hello &acirc;&#152;&#134; World &acirc;&#152;&#134;</h1> </body></html></code>
La solution :
Il existe deux approches principales pour résoudre ce problème :
1. Conversion de caractères en entités HTML :
La fonction mb_convert_encoding de PHP peut transformer les caractères en dehors de la plage US-ASCII en leurs entités HTML correspondantes. Cela garantit que DOMDocument peut interpréter correctement la chaîne :
<code class="php">$us_ascii = mb_convert_encoding($utf_8, 'HTML-ENTITIES', 'UTF-8');</code>
2. Spécification de l'indice d'encodage :
DOMDocument peut être indiqué sur l'encodage de la chaîne HTML en ajoutant une balise méta Content-Type :
<code class="html"><meta http-equiv="content-type" content="text/html; charset=utf-8"></code>
Cependant, en ajoutant directement la balise méta à la chaîne HTML dans le code peut entraîner des erreurs de validation. Pour éviter cela, vous pouvez charger la chaîne sans la balise méta et utiliser la méthode insertBefore pour l'ajouter en tant que premier enfant de l'élément head :
<code class="php">$dom = new DomDocument(); $dom->loadHTML($html); $head = $dom->getElementsByTagName('head')->item(0); $meta = $dom->createElement('meta'); $meta->setAttribute('http-equiv', 'content-type'); $meta->setAttribute('content', 'text/html; charset=utf-8'); $head->insertBefore($meta, $head->firstChild); $html = $dom->saveHTML();</code>
En employant l'une ou l'autre de ces méthodes, DOMDocument peut gérer efficacement HTML encodé en UTF-8, garantissant une représentation et un décodage corrects des caractères non US-ASCII.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!