Я использую 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
Если я найду какие-либо подробности, я добавлю их. Спасибо за ваше время и поддержку!
Не используйте utf8_decode
. Если ваш текст в UTF-8, передавайте его как таковой.
К сожалению, DOMDocument
по умолчанию принимает значение LATIN1 в случае HTML. Похоже, поведение следующее
Пример работы:
<?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;