С помощью этой команды:
$doc->loadHTML($html);
вы командуя DOMDocument загрузить вашу строку $html
$html = '<div id="demo">à la téléchargez mêmes</div>';
с ISO-8859-1 кодирования.
Но строка, которую вы используете, не просматривалась/не вводилась самостоятельно в кодировке ISO-8859-1, а в кодировке UTF-8.
Так технически говорят, вы ввели его неправильно там;)
Затем с другой стороны, когда вы командуете со сценарием для возврата значения:
$xpath->query("//div[@id='demo']")->item(0)->nodeValue;
that value will be UTF-8 encoded (прокрутите вниз до Примечания раздел и прочитать о кодировке символов).
Чтобы получить лучшее представление о документе, просто выход непосредственно после вызова loadHTML
таким образом, чтобы вы могли лучше видеть, что происходит (echo $doc->saveHTML();
, украшено):
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<body>
<div id="demo">
à la téléchargez mêmes
</div>
</body>
</html>
Как вы можете видеть, вам явно приказано вставить Atile и нераспространяющееся пространство и все эти другие символы, строка была взята как HTML 4.0, а поскольку в HTML в вашей строке не указана какая-либо конкретная кодировка символов, the default encoding (ISO-8859-1) использовался.
Так за то, что вы там, вы можете дальше читать дальше с существующим материалом, который покрывает это и имеет еще больше информации:
И дополнительно к answer given in the first of the two есть дополнительный способ сделать это в вашем случае:
$saved = libxml_use_internal_errors(true);
$result = $doc->loadHTML('<?xml>' . $html);
########
libxml_use_internal_errors($saved);
if ($result) {
$doc->removeChild($doc->documentElement->previousSibling);
}
Этот пример не только добавляет правильную обработку ошибок и возвращает значение, если HTML может быть загружен или нет, он также префикс вас строкой с магической последовательностью «<?xml>
», которая установит loadHTML
в режим UTF-8. После загрузки строки HTML, как с кодировкой UTF-8, снова удаляется DOMProcessingInstruction. Кодирование останется:
$xpath = new DOMXpath($doc);
echo $xpath->query("//div[@id='demo']")->item(0)->nodeValue;
# prints "à la téléchargez mêmes" now
Найти это продемонстрировано в Интернете здесь во многих диффере версиях PHP: http://3v4l.org/TT3SM
Попробуйте посмотреть на [этот ответ] (http://stackoverflow.com/questions/2142120/php-encoding -with-domdocument) –
@ BogdanKuštan Спасибо! Это работает – Vitaly