簡體   English   中英

PHP DOMDocument nodeValue返回不同​​的編碼

[英]PHP DOMDocument nodeValue returns different encoding

在解析html文檔時,使用DOMDocument,我從nodeValue獲得不同的編碼。 在我的開發環境中,我得到了UTF-8,但是當將腳本上傳到webserver時,我得到了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”

在公共Web服務器上運行時的輸出
編碼:utf-8
nodeValue:“NärsemesterninledsvankasÃ¥ska”
utf8_decode:“Närsemesterninledsvankasåska”
utf8_encode:“Nä¤rsemesterninledsvankasÃ¥ska”
從子串開始:“Närsemesterninledsvankasåska”

顯然,utf8_decode需要在公共Web服務器上使用,但不能在我的開發環境中使用。 我想在兩個系統上都有相同的行為。 有任何想法嗎?

通過在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”

我可以想到這種行為的兩個可能原因。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM