2010-10-06 104 views
1

我使用curl以俄語使用utf-8獲取頁面。如果我回顯文字,它顯示良好。然後我使用這樣的代碼與俄語語言的PHP問題

$dom = new domDocument; 

     /*** load the html into the object ***/ 
     @$dom->loadHTML($html); 

     /*** discard white space ***/ 
     $dom->preserveWhiteSpace = false; 

     /*** the table by its tag name ***/ 
     $tables = $dom->getElementsByTagName('table'); 

     /*** get all rows from the table ***/ 
     $rows = $tables->item(0)->getElementsByTagName('tr'); 

     /*** loop over the table rows ***/ 
     for ($i = 0; $i <= 5; $i++) 
     { 
      /*** get each column by tag name ***/ 
      $cols = $rows->item($i)->getElementsByTagName('td'); 

      echo $cols->item(2)->nodeValue; 

      echo '<hr />'; 
     } 

$ html包含俄語文本。在它後面行echo $ cols-> item(2) - > nodeValue;顯示錯誤文本,不是俄語。我嘗試iconv但不工作。有任何想法嗎?

+0

我不明白你的問題是什麼。你會得到什麼錯誤文字? 「不起作用」是什麼意思? – 2010-10-06 12:34:33

+0

而不是俄語我得到了ÐÑоÑо? – kusanagi 2010-10-06 12:36:13

回答

9

我建議之前加載UTF-8頁使用mb_convert_encoding

 
    $dom = new DomDocument(); 
    $html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8"); 
    @$dom->loadHTML($html); 

,否則你可以試試這個

 
    $dom = new DomDocument('1.0', 'UTF-8'); 
    @$dom->loadHTML($html); 
    $dom->preserveWhiteSpace = false; 
    .......... 
    echo html_entity_decode($cols->item(2)->nodeValue,ENT_QUOTES,"UTF-8"); 
    .......... 
+0

很棒!!!!!!!!!!!! – kusanagi 2010-10-06 16:08:05

+1

+1 for mb_convert_encoding – 2010-11-17 21:34:27

+0

loadHTML從我的理解中只支持ISO-88591。這就是爲什麼你必須將所有utf-8字符編碼到它們的實體中(這實際上是utf-16實體)。如果你想避免轉換,你可以使用支持utf-8的loadXML,但是loadXML對破損的元素非常嚴格,而且你必須爲非關閉元素做很多字符串修復,比如
Gorilla3D 2011-07-12 00:20:25

0

DOM無法識別HTML的編碼。 您可以嘗試類似:

$doc = new DOMDocument(); 
$doc->loadHTML('<?xml encoding="UTF-8">' . $html); 

// taken from http://php.net/manual/en/domdocument.loadhtml.php#95251 
+1

我需要加載html而不是xml,這種方式根本不起作用 – kusanagi 2010-10-06 12:41:35

+0

它就是這樣。 HTML基本上是一個具有給定定義的XML文檔。你總是可以試試看看它是否有效。 – bisko 2010-10-06 13:19:00

0

mb_convert_encoding($ HTML, 'HTML實體', 「UTF-8」);

同樣的事情爲PHPQuery工作。

P.S.我使用phpQuery :: newDocument($ html);

而不是$ dom-> loadHTML($ html);