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

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

20
задан Charles 24 December 2012 в 00:03
поделиться

3 ответа

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

$string = mb_convert_encoding($string, 'HTML-ENTITIES', "UTF-8");
$dom->loadHTML($string);
40
ответ дан 29 November 2019 в 23:30
поделиться

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

    $dom = new DOMDocument('1.0', 'utf-8');
4
ответ дан 29 November 2019 в 23:30
поделиться

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

1
ответ дан 29 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: