使用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服务器上使用,但不能在我的开发环境中使用。我想在两个系统上都有相同的行为。有什么想法吗?
答案 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';");
}