Maison  >  Article  >  développement back-end  >  Pourquoi DOMDocument ne parvient-il pas à gérer correctement les caractères UTF-8 lors du chargement de HTML ?

Pourquoi DOMDocument ne parvient-il pas à gérer correctement les caractères UTF-8 lors du chargement de HTML ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-04 10:12:30447parcourir

Why does DOMDocument fail to handle UTF-8 characters correctly when loading HTML?

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>

Cause

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.

Solution

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn