Я использую 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 une date déterminante dans son spectaculaire cheminement
Вывод: Sans doute parce qu? Il vient d? Atteindre une date déterminante dans son spectaculaire 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;
loadHtml()
не всегда распознает правильную кодировку, указанную в метатеге HTTP-EQUIV Content-type.
Если DomDocument('1.0', 'UTF-8')
и loadHTML('<?xml version="1.0" encoding="UTF-8"?>' . $html)
не работают, поскольку они не для меня (PHP 5.3.13), попробуйте следующее:
Добавьте еще один раздел <head>
сразу после открытия <html>
с правильным метатегом HTTP-EQUIV Content-type. Затем вызовите loadHtml()
, затем удалите дополнительный <head>
.
// 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 <html> to force UTF-8 encoding $insertPoint = false; if (preg_match("/<html.*?>/is", $body, $matches, PREG_OFFSET_CAPTURE)) { $insertPoint = mb_strlen( $matches[0][0] ) + $matches[0][1]; } if ($insertPoint) { $body = mb_substr( $body, 0, $insertPoint ) . "<head><meta http-equiv='Content-type' content='text/html; charset=UTF-8' /></head>" . 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 <head>
См. Эту статью: http://devzone.zend.com/1538/php-dom-xml-extension-encoding-processing/
Этого было достаточно для меня, другие ответы здесь были излишними. Учитывая, что у меня есть документ HTML с существующим тегом HEAD. Теги HEAD не имеют атрибутов, и у меня не было проблем с тем, чтобы оставить лишний тег META в HTML для моего прецедента.
$data = str_ireplace('<head>', '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />', $data); $document = new DOMDocument(); $document->loadHTML($data);