Maison > développement back-end > tutoriel php > Pourquoi DOMDocument a-t-il du mal avec les caractères UTF-8 et comment y remédier ?

Pourquoi DOMDocument a-t-il du mal avec les caractères UTF-8 et comment y remédier ?

Linda Hamilton
Libérer: 2024-11-04 09:55:02
original
860 Les gens l'ont consulté

Why Does DOMDocument Struggle with UTF-8 Characters and How to Fix It?

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

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>&amp;acirc;&amp;#152;&amp;#134; Hello &amp;acirc;&amp;#152;&amp;#134; World &amp;acirc;&amp;#152;&amp;#134;</h1>    
</body></html></code>
Copier après la connexion

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

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

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

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!

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