PHP DOMDocument nodeValue返回不同的编码


PHP DOMDocument nodeValue returns different encoding

在解析html文档时,使用DOMDocument,我从nodeValue中获得不同的编码。在我的开发环境中,我得到UTF-8,然而,当将脚本上传到web服务器时,我得到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 semesterin vankas ' ska"
utf8_encode: "När semestern inleds vankas åska"
标题来自子字符串:"När semestern inleds vankas ska"

在公共web服务器上运行时的输出
utf - 8编码:
nodeValue: "När semestinleds 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需要在公共web服务器上使用,但不是在我的开发环境中。我希望在两个系统上都有相同的行为。什么好主意吗?

通过更新web酒店服务器上的PHP解决了问题。

web hotel的旧配置:
PHP版本:5.2.6-1+lenny13
libxml Version: 2.6.32

更新了web hotel的配置:
PHP 5.3.3-7+squeeze3
libxml Version 2.7.8

脚本现在在两个环境中生成相同的输出
utf - 8编码:
nodeValue: "När semestinleds vankas åska"
utf8_decode: "När semestern inleds vankas ska"
utf8_encode: "När semestern inleds vankas ÃÂ¥ska"
标题来自子字符串:"När semestern inleds vankas ska"

对于这种行为我可以想到两个可能的原因。

首先看一下两个php.ini文件中的default_charset。我想你会发现一个将其设置为"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';");
    }