Подтвердить что ты не робот

Почему 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, я убедился, что я.

Заранее спасибо:)

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Мне нужно было добавить заголовок utf8, чтобы получить правильное представление:

header('Content-Type: text/html; charset=utf-8');