PHP DOMDocument nodeValue возвращает другую кодировку - PullRequest
3 голосов
/ 31 июля 2011

При разборе html-документа, используя DOMDocument, я получаю другую кодировку от nodeValue. В моей среде разработки я получаю UTF-8, однако при загрузке скрипта на веб-сервер я получаю ISO-8859-1.

Может кто-нибудь объяснить это поведение и как получить ту же кодировку?

<?php
header('Content-Type:text/html; charset=UTF-8');
$strHtml = file_get_contents("http://www.aftonbladet.se/senastenytt/ttnyheter/inrikes/article13397806.ab");

$objDOM= new DOMDocument();
@$objDOM->loadHTML($strHtml);
echo "Encoding: ". $objDOM->encoding."<br/>";

//Parse heading from DOMDocument
$objNodelist = $objDOM->getElementsByTagname('h1');
foreach ($objNodelist as $objElem)
{
    $strNodeValue = $objElem->nodeValue; //get the 
    break;
}
echo 'nodeValue: "'.$strNodeValue.'"<br/>';
echo 'utf8_decode: "'.utf8_decode($strNodeValue).'"<br/>';
echo 'utf8_encode: "'.utf8_encode($strNodeValue).'"<br/>';

//Parse heading using substring from html
$strHeading = substr($strHtml , strpos($strHtml, '<h1 class="abS32">')+18, strpos($strHtml, '</h1>') - strpos($strHtml, '<h1 class="abS32">')-18);
echo 'Heading from substring: "'.$strHeading.'"';
?>

Вывод при запуске в среде разработки
Кодировка: utf-8
nodeValue: "När semestern inleds vankas åska"
utf8_decode: "N r semestern inleds vankas ska"
utf8_encode: "Når semestern inleds vankas à ¥ ska"
Заголовок из подстроки: "När semestern inleds vankas åska"

Вывод при запуске на общедоступном веб-сервере
Кодировка: utf-8
nodeValue: "Når semestern inleds vankas à ¥ ska"
utf8_decode: "När semestern inleds vankas åska"
utf8_encode: "Når semestern inleds vankas à ¥ ska"
Заголовок из подстроки: "När semestern inleds vankas åska"

Очевидно, что utf8_decode нужно использовать на общедоступном веб-сервере, но не в моей среде разработки. Я хотел бы иметь одинаковое поведение в обеих системах. Есть идеи?

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Проблема была решена путем обновления PHP на сервере веб-отеля.

Старая конфигурация в веб-отеле:
PHP Версия: 5.2.6-1 + lenny13
libxml Версия: 2.6.32

Обновленная конфигурация в веб-отеле:
PHPВерсия 5.3.3-7 + squeeze3
libxml Версия 2.7.8

Сценарий теперь генерирует одинаковые выходные данные в обеих средах
Кодировка: utf-8
nodeValue: "Når semestern inleds vankas sk ska"
utf8_decode: "När semestern inleds vankas åska"
utf8_encode: "Nä¤ semestern inleds vankas à ¥ ska"
Заголовок из подстроки: "Ninleds vankas åska "

0 голосов
/ 31 июля 2011

Я могу вспомнить две возможные причины такого поведения.

Первый - взгляните на default_charset в двух файлах php.ini.Я думаю, вы обнаружите, что один устанавливает его на «iso-8859-1» (по умолчанию), а другой на «utf8».

Во-вторых, проверьте код, используемый для подключения php к вашей базе данных, и соединение с базой данных по умолчанию отключается.Они также могут быть разными.

Вы можете использовать следующий код для переключения соединения Mysql на utf-8.

if (phpversion() > "5.0.7") {
        $result = mysql_set_charset('utf8');
    } else {
        $result = mysql_query("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';");
    }
...