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.