Por que PHP DOMDocument loadHTML não funciona para caracteres persas?

Aqui está o meu código :

<?php $data = <<<DATA  DATA; $dom = new DOMDocument(); $dom->loadHTML(mb_convert_encoding($data, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); $xpath = new DOMXPath($dom); foreach ($xpath->query("//*[@*]") as $node) { $parent = $node->parentNode; while ($node->hasChildNodes()) { $parent->insertBefore($node->lastChild, $node->nextSibling); } $parent->removeChild($node); } echo $dom->saveHTML(); 

Como mencionei no título da minha pergunta, o conteúdo do meu site é persa (não em inglês) . Mas o código sobre não funciona para caracteres persas.

Saída atual:

 . . 

سلام

. .

Produção esperada:

 . . 

سلام

. .

O que há de errado com isso e como posso corrigi-lo?

Nota: Além disso, como você vê, usei mb_convert_encoding($data, 'HTML-ENTITIES', 'UTF-8') para corrigi-lo (com base nessa resposta ), mas ainda não funciona.

Os caracteres persas estão sendo codificados como referências de caracteres numéricos. Eles aparecerão adequadamente em um navegador ou você pode ver o original decodificando-os com html_entity_decode() , por exemplo:

 echo html_entity_decode("سلام"); 

saídas:

 سلام 

Se você preferir os caracteres originais na saída ao invés de referências de caracteres numéricos, você pode alterar:

 echo $dom->saveHTML(); 

para:

 echo $dom->saveHTML($dom->documentElement); 

Isso altera um pouco a serialização e o resultado é:

 

سلام

Remove this one

But keep this

and this and

also

this and this too

Exemplo.