> Faqs > Cómo puedo usar el encoding correcto con PHP DOMDocument al cargar HTML con loadHTML

Cómo puedo usar el encoding correcto con PHP DOMDocument al cargar HTML con loadHTML

Estoy intentado interpretar el código HTML de un texto, para modificarlo usando PHP.

Veo que PHP contiene la clase DOMDocument que te permite hacer consultas en el documento HTML como si fuera el DOM del navegador que estoy acostumbrado a usar con Javascript... o por lo menos eso entiendo yo.

El tema es que intento hacer el tratamiento para sacar todos los titulares de la página de nivel H2 y hago algo tan simple como mostrar esos titulares en la página pero me muestra el encoding mal.

Estoy seguro que los textos que estoy accediendo tienen el juego de caracteres UTF-8, porque los tengo en una tabla de la base de datos con ese juego de caracteres y la página los muestra bien, pero cuando los extraigo con DOMDocument me salen mal los acentos.

Además estoy colocando correctamente el juego de caracteres UTF-8 cuando instancio el objeto de DOMDocument.

Este es mi código:

$doc = new DOMDocument("1.0", "UTF-8");
$doc->loadHTML($contenidoHTML);
$h2Elements = $doc->getElementsByTagName('h2');
foreach($h2Elements as $h2) {
  echo $h2->textContent;
}

¿Alguien sabe cómo puedo usar el encoding UTF-8 al cargar un contenido HTML parcial con loadHTML()?

Respuestas

Creo que sé el problema que te ocurre. Básicamente es lo siguiente:

Para conseguir que se representen bien los documentos UTF-8 tienes que tener dos cosas:

  • Como has indicado, en el constructor indicar correctamente el juego de caracteres UTF-8. Eso ya lo tienes en tu código, así que este no es el problema y, de todos modos, si no indias nada te pilla también UTF-8.
  • Además necesitas indicar la correspondiente etiqueta de "encoding", que probablemente no tengas.

Todos los documentos XML comienzan declarando el encoding así:

<?xml version="1.0" encoding="UTF-8" ?>

Si tu código es HTML da un poco igual porque estas funciones de PHP se encargan de procesarlo igual. Pero lo que puede pasar es que en ese documento no tengas declarado el encoding, porque sea un pedazo de HTML sin especificar el documento completo.

La idea que se puede hacer es, al cargar el documento con loadHTML() que quieres procesar, le indiques previamente el encoding, así:

$doc = new DOMDocument("1.0", "UTF-8");
$doc->loadHTML('<?xml encoding="utf-8" ?>' . $contenidoHTML);

Así le estás agregando lo que hace falta para que PHP sepa que ese contenido viene con UTF-8 y lo procese bien, colocando correctamente acentos y otros caracteres del español.

Julian
1100 46 84 45
Muchas gracias por tu respuesta. Lo he solucionado como tú has indicado, colocando el encoding a capón antes del contenido HTML.