Я пытаюсь разобрать некоторый HTML с помощью DOMDocument, но когда я это делаю, я внезапно теряю свою кодировку (по крайней мере, так мне кажется).
$profile = "<div><p>various japanese characters</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $div) {
echo $dom->saveHTML($div);
}
Результатом этого кода является то, что я получаю набор символов, которые не являются японскими. Однако, если я сделаю:
echo $profile;
он отображается правильно. Я пробовал saveHTML и saveXML, и ни один из них не отображается правильно. Я использую PHP 5.3.
Что я вижу:
ã¤ãªãã¤å·ã·ã«ã´ã«ã¦ãã¢ã¤ã«ã©ã³ãç³»ã®å®¶åºã«ã9人åå¼ã®5çªç®ã¨ãã¦çã¾ãããå½¼ãå«ãã¦4人ã俳åªã«ãªã£ããç¶è¦ªã¯æ¨æã®ã»ã¼ã«ã¹ãã³ã§ãæ¯è¦ªã¯éµä¾¿å±ã®å®¢å®¤ä¿ã ã£ããé«æ ¡æ代ã¯ãã£ãã£ã®ã¢ã«ãã¤ãã«å¤ãã¿ãæè²è³éãåããªããã«ããªãã¯ç³»ã®é«æ ¡ã¸é²å¦ã
Что должно быть показано:
イリノイ州シカゴにて、アイルランド系の家庭に、9人兄弟の5番目として生まれる。彼を含めて4人が俳優になった。父親は木材のセールスマンで、母親は郵便局の客室係だった。高校時代はキャディのアルバイトに勤しみ、教育資金を受けながらカトリック系の高校へ進学
РЕДАКТИРОВАТЬ: я упростил код до пяти строк, чтобы вы могли проверить его самостоятельно.
$profile = "<div lang=ja><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
echo $dom->saveHTML();
echo $profile;
Вот HTML, который возвращается:
<div lang="ja"><p>イリノイ州シカゴã«ã¦ã€ã‚¢ã‚¤ãƒ«ãƒ©ãƒ³ãƒ‰ç³»ã®å®¶åºã«ã€</p></div>
<div lang="ja"><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>
php
utf-8
character-encoding
Слегка А.
источник
источник
Ответы:
DOMDocument::loadHTML
будет относиться к вашей строке как к ISO-8859-1, если вы не укажете иначе. Это приводит к тому, что строки UTF-8 интерпретируются неправильно.Если ваша строка не содержит объявления кодировки XML, вы можете добавить его, чтобы строка была обработана как UTF-8:
Если вы не можете знать, будет ли строка уже содержать такое объявление, в SmartDOMDocument есть обходной путь, который должен вам помочь:
Это не лучший обходной путь, но, поскольку не все символы могут быть представлены в ISO-8859-1 (как эти катаны), это самая безопасная альтернатива.
источник
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
исправил это для меня в PHP7 (так что это все еще проблема) - это действительно раздражающая проблема, потому что я определил utf8 в документе HTML (с<meta charset="UTF-8" />
), но это не имеет никакого эффекта, похоже, нужна часть <? xml, которая совершенно не интуитивно.$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
прекрасно работает! Спасибо,Проблема с,
saveHTML()
иsaveXML()
оба они не работают правильно в Unix. Они не сохраняют символы UTF-8 правильно при использовании в Unix, но работают в Windows.Обходной путь очень прост:
Если вы попробуете по умолчанию, вы получите ошибку, которую вы описали
Все, что вам нужно сделать, это сохранить следующим образом:
Эта строка кода поможет вам правильно сохранить символы UTF-8. Используйте тот же обходной путь, если вы используете
saveXML()
.Обновить
Как предложено « Джеком М » в разделе комментариев ниже, и проверено « Памелой» » и « Марко Аурелио Делё », в вашем случае может подойти следующая вариация:
Заметка
Английские символы не вызывают проблем при использовании
saveHTML()
без параметров (поскольку английские символы сохраняются как однобайтовые символы в UTF-8)Проблема возникает, когда у вас есть многобайтовые символы (например, китайский, русский, арабский, иврит и т. Д.)
Я рекомендую прочитать эту статью: http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/ . Вы поймете, как работает UTF-8 и почему у вас такая проблема. Это займет у вас около 30 минут, но это хорошо проведенное время.
источник
$str = utf8_decode($dom->saveHTML($dom->documentElement));
utf8_decode($dom->saveHTML($dom->documentElement));
сделал это идеально для меня.Убедитесь, что реальный исходный файл сохранен как UTF-8 (Вы можете даже попробовать не рекомендуемые символы спецификации с UTF-8, чтобы убедиться).
Также в случае HTML, убедитесь, что вы объявили правильную кодировку, используя
meta
теги:Если это CMS (как вы отметили свой вопрос в Joomla), вам может потребоваться настроить соответствующие параметры для кодировки.
источник
<meta charset="UTF-8">
тег не работает с DOMDocument.Вы можете добавить префикс для
utf-8
кодирования строки следующим образом:И затем вы можете продолжить с кодом, который у вас уже есть, например:
источник
Мне потребовалось некоторое время, чтобы понять, но вот мой ответ.
Перед использованием DomDocument я использовал бы file_get_contents для получения URL-адресов, а затем обрабатывал их строковыми функциями. Возможно, не лучшим способом, но быстрым. Убедившись, что Дом так же быстр, я сначала попробовал следующее:
Это не помогло сохранить кодировку UTF-8, несмотря на правильные метатеги, настройки php и все остальные средства защиты, предлагаемые здесь и в других местах. Вот что работает:
и т.д. Теперь все в порядке с миром. Надеюсь это поможет.
источник
DomDocument('1.0', 'UTF-8')
. Но в моем случае загружается только частичный html.Вы должны предоставить DOMDocument версию вашего HTML-кода с заголовком, который имеет смысл. Так же, как HTML5.
Может быть, это хорошая идея, чтобы сохранить ваш HTML настолько действительным, насколько это возможно, чтобы вы не столкнулись с проблемами при запуске запроса ... вокруг :-) и держитесь подальше от
htmlentities
!!!! Это необходимая трата ресурсов назад и вперед. держи свой код безумным !!!!источник
Я использую php 7.3.8 на manjaro, и я работал с персидским контентом. Это решило мою проблему:
источник
Работает финде для меня:
источник
?
)Используйте это для правильного результата
Эта операция
Это плохо, потому что специальные символы, такие как & lt; & gt; может быть в профиле $, и они не будут преобразованы дважды после mb_convert_encoding. Это дыра для XSS и неправильного HTML.
источник
Единственное, что сработало для меня, это принятый ответ
ТЕМ НЕ МЕНИЕ
Это вызвало новые проблемы, имеющие
<?xml encoding="utf-8" ?>
с выводом документа.Решение для меня было тогда сделать
Некоторые решения говорили мне, что для удаления
xml
заголовка, что я должен был выполнитьЭто не сработало для меня, как для частичного документа (например, документа с двумя
<p>
тегами), только один из<p>
тегов был возвращен.источник
Можно также кодировать, как показано ниже .... собрано из https://davidwalsh.name/domdocument-utf8-problem
источник
Это сработало для меня.
В
php.ini
файле измените следующее свойство.Перед:
После:
источник
Проблема в том, что когда вы добавляете параметр в
DOMDocument::saveHTML()
функцию, вы теряете кодировку. В некоторых случаях вам нужно избегать использования параметра и использовать старую строковую функцию, чтобы найти то, что вы ищете.Я думаю, что предыдущий ответ работает для вас, но так как этот обходной путь не работает для меня, я добавляю этот ответ, чтобы помочь людям, которые могут быть в моем случае.
источник