Почему DOM меняет кодировку?

$string = file_get_contents('http://example.com'); if ('UTF-8' === mb_detect_encoding($string)) { $dom = new DOMDocument(); // hack to preserve UTF-8 characters $dom->loadHTML('<?xml encoding="UTF-8">' . $string); $dom->preserveWhiteSpace = false; $dom->encoding = 'UTF-8'; $body = $dom->getElementsByTagName('body'); echo htmlspecialchars($body->item(0)->nodeValue); } 

Это изменяет все символы UTF-8 до Å, ¾, ¤ и другого мусора. Есть ли другой способ сохранения символов UTF-8?

Не отправляйте ответы, говорящие мне, чтобы убедиться, что я выводил его как UTF-8, я убедился, что я.

Заранее спасибо 🙂

У меня были аналогичные проблемы в последнее время, и в итоге я нашел это обходное решение – преобразовать все символы без ascii в html-объекты до загрузки html

 $string = mb_convert_encoding($string, 'HTML-ENTITIES', "UTF-8"); $dom->loadHTML($string); 

В случае, если определенно DOM закручивает кодировку, этот трюк сделал это для меня некоторое время назад наоборот (принимая данные ISO-8859-1). DOMDocument должен быть UTF-8 по умолчанию в любом случае, но вы все равно можете попробовать:

  $dom = new DOMDocument('1.0', 'utf-8'); 

В верхней части скрипта, где находится ваш PHP-код (код, который вы разместили здесь), убедитесь, что вы отправляете заголовок utf-8. Бьюсь об заклад, ваша кодировка является некоторым вариантом latin1 прямо сейчас. Да, я знаю, что удаленная веб-страница – это utf8, но этот php-скрипт не является.