Проблемы кодирования DOMDocument / преобразованные символы

Я использую DOMDocument для манипулирования / изменения HTML, прежде чем он получит вывод на страницу. Это только фрагмент HTML, а не полная страница. Моя первоначальная проблема заключалась в том, что все французские персонажи испортились, что я смог исправить после некоторых проб и ошибок. Теперь кажется, что остается только одна проблема: «персонаж превращается в? .

Код:

<?php
    $dom = new DOMDocument('1.0','utf-8');
         $dom->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('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveHTML())));
?>

Я это знаю. Не все в порядке с декодированием / кодированием utf8, но это единственный способ, которым я мог до сих пор работать. Вот пример строки:

Вход: Sans doute parce qu'il vient d'atteindre и дата детерминированного шоу-спектакля

Результат: Sans doute parce quil il vient d? Atindindre any date deteterminante dans son spectulaire cheminement

Если я найду какие-либо подробности, я добавлю их. Спасибо за ваше время и поддержку!

7
задан casperOne 29 April 2012 в 14:32
поделиться

1 ответ

Не используйте utf8_decode. Если ваш текст в UTF-8, передавайте его как таковой.

К сожалению, DOMDocument по умолчанию принимает значение LATIN1 в случае HTML. Похоже, поведение следующее

  • При получении удаленного документа, он должен определить кодировку из заголовков
  • Если заголовок не был отправлен или файл локальный, ищите соответствующий meta-equiv
  • В противном случае, по умолчанию используется LATIN1.

Пример работы:

<?php
$s = <<<HTML
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
Sans doute parce qu’il vient d’atteindre une date déterminante
dans son spectaculaire cheminement
</body>
</html>
HTML;

libxml_use_internal_errors(true);
$d = new domdocument;
$d->loadHTML($s);

echo $d->textContent;

И с XML (по умолчанию UTF-8):

<?php
$s = '<x>Sans doute parce qu’il vient d’atteindre une date déterminante'.
    'dans son spectaculaire cheminement</x>';
libxml_use_internal_errors(true);
$d = new domdocument;
$d->loadXML($s);

echo $d->textContent;
16
ответ дан 6 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: