Incapacité de DOMDocument à gérer les caractères UTF-8
Dans un scénario où un serveur Web transmet des réponses avec le codage UTF-8, tous les fichiers sont également enregistré en UTF-8 et que tous les paramètres pertinents ont été configurés pour l'encodage UTF-8, un problème se pose. Un programme de test conçu pour vérifier la fonction de sortie démontre un comportement irrégulier.
Lors de l'exécution du programme, la sortie est rendue comme suit :
<!DOCTYPE html> <html><head><meta charset="utf-8"><title>Test!</title></head><body> <h1>☆ Hello ☆ World ☆</h1> </body></html>
qui se présente comme :
< ;h1>☆ Bonjour ☆ Monde ☆
Le programme :
<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>
La cause sous-jacente est que DOMDocument::loadHTML() anticipe une chaîne au format HTML. HTML utilise intrinsèquement ISO-8859-1 (ISO Latin Alphabet No. 1) comme codage de caractères par défaut. Par conséquent, lorsqu'un analyseur HTML conçu pour HTML 4.0 rencontre des caractères dépassant cet encodage, il peut présenter un comportement imprévisible.
Conversion de caractères non-ASCII en entités
Pour remédier à ce problème, tous les caractères en dehors de la plage ASCII (127 / h7F) doivent être convertis en entités HTML. Ce processus peut être réalisé en utilisant mb_convert_encoding avec l'encodage cible HTML-ENTITIES :
<code class="php">$html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8");</code>
Ajout d'une balise méta de type de contenu
Alternativement, le problème peut être résolu en incorporant un balise dans le document lui-même, en spécifiant le jeu de caractères comme UTF-8 :
<code class="html"><meta http-equiv="content-type" content="text/html; charset=utf-8"></code>
Cette méthode sert d'indice au DOMDocument, le forçant à interpréter l'entrée comme codée en UTF-8. Même s'il est positionné à l'extérieur de la zone
section, les spécifications HTML 2.0 stipulent que ces éléments seront automatiquement déplacés dans l'en-tête.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!