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

Mary-Kate Olsen
Libérer: 2024-11-04 10:12:30
original
470 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal