Intereting Posts
Получить переменную php в javascript Заголовок Content-Length всегда равен нулю Каков наилучший способ сохранить переменные конфигурации в веб-приложении PHP? MySQL – Как получить результаты поиска с точной релевантностью Связывание MySQL с локальным портом через SSH – работает в консоли, а не через PHP shell_exec () в Mac OSX mysqli multiple query – set variable производит ошибку boolean / как пропустить это? В PHP 5.3.0, что такое функция «использовать» идентификатор? SVG для PNG с несколькими слоями изображения с использованием PHP Проводка изображений через CURL в форму Проблема подключения к базе данных sqlite с использованием php REGEX для маскировки всех символов, кроме первого и последнего символов Лучшие практики для индивидуальных помощников на Laravel 5 Xdebug успешно подключается к клиентам DBGP, но не останавливается на контрольных точках Выполнение while / loop для получения 10 случайных результатов Каков наилучший способ разрешить относительный путь (например, realpath) для несуществующих файлов?

Проблемы / символы кодирования 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 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. Кажется, это поведение

  • Если вы извлекаете удаленный документ, он должен выводить кодировку из заголовков
  • Если заголовок не был отправлен или файл является локальным, найдите соответствующий 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; 

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);