2015-08-08 2 views
0

Я пытаюсь разобрать текст на французском языке из элемента html, используя DOMDocument и Xpath. Проблема в том, что выходная кодировка неверна.Проблемы с французским кодированием в DOMDocument

Вот текст на французском языке:

à la téléchargez mêmes 

Что я вижу на выходе:

à la téléchargez mêmes 

PHP код:

<?php 
$html = '<div id="demo">à la téléchargez mêmes</div>'; 
$doc = new DOMDocument(); 
@$doc->loadHTML($html); 
$xpath = new DOMXpath($doc);  
echo $xpath->query("//div[@id='demo']")->item(0)->nodeValue; 

Спасибо за любые предложения.

+0

Попробуйте посмотреть на [этот ответ] (http://stackoverflow.com/questions/2142120/php-encoding -with-domdocument) –

+0

@ BogdanKuštan Спасибо! Это работает – Vitaly

ответ

2

С помощью этой команды:

$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"> 
     &Atilde;&nbsp; la t&Atilde;&copy;l&Atilde;&copy;chargez m&Atilde;&ordf;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