DOMDocument que codifica problemas / personagens transformados

Estou usando DOMDocument para manipular / modificar HTML antes que ele obtenha saída para a página. Este é apenas um fragment html, não uma página completa. O meu problema inicial foi que todo o personagem francês ficou confuso, o que consegui corrigir depois de algum erro de teste. Agora, parece apenas um problema: “o personagem se transforma em? .

O código :

loadHTML(utf8_decode($row->text)); //Some pretty basic modification here, not even related to text //reinsert HTML, and make sure to remove DOCTYPE, html and body that get added auto. $row->text = utf8_encode(preg_replace('/^/', '', str_replace( array('', '', '', ''), array('', '', '', ''), $dom->saveHTML()))); ?> 

Eu sei que está ficando desordenado com o decodificador / codificação utf8, mas essa é a única maneira de fazê-lo funcionar até agora. Aqui está uma cadeia de exemplo:

Entrada: sem duvidar porque ele vem de encontro a uma data determinada no seu idioma

Saída: Sans doute parce qu? Il vient d? Atteindre uma data determinada em son espectaculaire cheminement

Se eu encontrar mais detalhes, os adicionarei. Obrigado pelo seu tempo e apoio!

Não use utf8_decode . Se o seu texto estiver em UTF-8, passe-o como tal.

Infelizmente, o DOMDocument padrão para LATIN1 no caso de HTML. Parece que o comportamento é esse

  • Se for buscar um documento remoto, deve deduzir a codificação dos headers
  • Se o header não foi enviado ou o arquivo é local, procure o correspondente meta-equiv
  • Caso contrário, padrão para LATIN1.

Exemplo de funcionamento:

      Sans doute parce qu'il vient d'atteindre une date déterminante dans son spectaculaire cheminement   HTML; libxml_use_internal_errors(true); $d = new domdocument; $d->loadHTML($s); echo $d->textContent; 

E com XML (o padrão é UTF-8):

 Sans doute parce qu'il vient d'atteindre une date déterminante'. 'dans son spectaculaire cheminement'; libxml_use_internal_errors(true); $d = new domdocument; $d->loadXML($s); echo $d->textContent; 

loadHtml() nem sempre reconhece a codificação correta conforme especificado na meta-tag HTTP-EQUIV do tipo Conteúdo.

Se os DomDocument('1.0', 'UTF-8') e loadHTML('' . $html) não funcionam como não para mim (PHP 5.3.13), tente isso:

Adicione outra seção imediatamente após a abertura da marca com a meta-tag HTTP-EQUIV correta do conteúdo. Em seguida, chame loadHtml() , em seguida, remova a marca extra.

 // Ensure entire page is encoded in UTF-8 $encoding = mb_detect_encoding($body); $body = $encoding ? @iconv($encoding, 'UTF-8', $body) : $body; // Insert a head and meta tag immediately after the opening  to force UTF-8 encoding $insertPoint = false; if (preg_match("//is", $body, $matches, PREG_OFFSET_CAPTURE)) { $insertPoint = mb_strlen( $matches[0][0] ) + $matches[0][1]; } if ($insertPoint) { $body = mb_substr( $body, 0, $insertPoint ) . "" . mb_substr( $body, $insertPoint ); } $dom = new DOMDocument(); // Suppress warnings for loading non-standard html pages libxml_use_internal_errors(true); $dom->loadHTML($body); libxml_use_internal_errors(false); // Now remove extra  

Veja este artigo: http://devzone.zend.com/1538/php-dom-xml-extension-encoding-processing/

Isso foi o suficiente para mim, as outras respostas aqui foram excessivas. Dado que tenho um documento HTML com uma tag HEAD existente. As tags HEAD não possuem atributos e não tive problemas ao deixar a tag META extra no HTML para o meu caso de uso.

 $data = str_ireplace('', '', $data); $document = new DOMDocument(); $document->loadHTML($data);