Почему синтаксический анализ php DOM влияет на кодировку?

$dom = new DOMDocument();
$dom->loadHTML($string);
$dom->preserveWhiteSpace = false;
$elements = $dom->getElementsByTagName('span');
$spans = array();
foreach($elements as $span) {
    $spans[] = $span;
}
foreach($spans as $span) {
    $span->parentNode->removeChild($span);
}
return $dom->saveHTML();    
//return $string;

Когда я использую этот код для анализа строки, он меняет кодировку, и символы не отображаются одинаково, когда return $string раскомментирован. Почему так и как избежать смены кодировки

Иль


person ilija veselica    schedule 04.10.2009    source источник
comment
Какова кодировка вашего HTML-документа и что вы делаете с возвращаемым значением?   -  person Gumbo    schedule 04.10.2009


Ответы (3)


К сожалению, кажется, что DOMDocument автоматически преобразует все символы в объекты HTML, если только ему не известна кодировка исходного документа.

По-видимому, один из вариантов — добавить тег <meta> с типом/кодировкой контента в исходную строку, но это означает, что он будет присутствовать и в выводе. Удалить его может быть не так просто.

Другой вариант, который я могу придумать, - это ручное декодирование объектов HTML с использованием такого кода:

$trans = array_flip(get_html_translation_table(HTML_ENTITIES));
unset($trans["&quot;"], $trans["&lt;"], $trans["&gt;"], $trans["&amp;"]);
echo strtr($dom->saveHTML(), $trans);

Это очень уродливое решение, но я не могу придумать ничего другого, кроме использования другого парсера HTML. :(

person Lukáš Lalinský    schedule 04.10.2009
comment
Определенно, я должен хранить данные в базе данных в кодировке utf-8. Это единственная ситуация, когда DOMDocument работает. Кстати, я не совсем уверен, как использовать это ваше решение. Что на самом деле содержит переменная $trans? Спасибо, Иль - person ilija veselica; 04.10.2009

Попробуйте установить кодировку в конструкторе или с помощью DOMDocument->encoding:

$dom = new DOMDocument('1.0', '…');
// or
$dom = new DOMDocument();
$dom->encoding = '…';
person Gumbo    schedule 04.10.2009

Есть также одна интересная вещь, которую я заметил сегодня... Я не понял, почему это происходит, но это очень странное поведение... код сверху настроен на работу. Когда строка передается в функцию и после ее обработки функцией к возвращаемой строке добавляется <doctype...> <html><body>STRING</body></html> в некоторых необъяснимых случаях: данные загружаются из базы данных, и когда эти данные из базы данных напрямую передаются в функцию, эти дополнительные теги не добавляются, но когда данные сначала хранится в переменной, а затем эта функция вызывается где-то ниже этих дополнительных значений. Также одна странная вещь... У меня был случай, когда я вызвал эту дополнительную функцию для обработки строки, и несколькими строками ниже я добавил функцию обрезки, она вернула мне ошибку из функции dom... и когда я удалил эту функцию обрезки (которая была вызвана ПОСЛЕ функция dom) ошибка исчезла... Любое разумное объяснение?

person ilija veselica    schedule 05.10.2009