PHP DOMDocument nodeValue返回不同​​的编码

时间:2011-07-30 21:09:42

标签: php encoding character-encoding html-parsing

使用DOMDocument解析html文档时,我从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ärsemesterninledsvankasåska”
utf8_decode:“N rsemesterninleds vankas ska”
utf8_encode:“NärsemesterninledsvankasÃ¥ska”
从子串开始:“Närsemesterninledsvankasåska”

在公共网络服务器上运行时的输出
编码:utf-8
nodeValue:“NärsemesterninledsvankasÃ¥ska”
utf8_decode:“Närsemesterninledsvankasåska”
utf8_encode:“Nä¤rsemesterninledsvankasÃ¥ska”
从子串开始:“Närsemesterninledsvankasåska”

显然,utf8_decode需要在公共Web服务器上使用,但不能在我的开发环境中使用。我想在两个系统上都有相同的行为。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

通过在Web酒店服务器上更新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ärsemesterninledsvankasÃ¥ska”
utf8_decode:“Närsemesterninledsvankasåska”
utf8_encode:“Nä¤rsemesterninledsvankasÃ¥ska”
从子串开始:“Närsemesterninledsvankasåska”

答案 1 :(得分:0)

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

首先 - 看一下两个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';");
    }