2009-07-20 32 views
5

私はGreasemonkey AJAXを介してPHPアプリケーションに渡されるXHTML文書を持っています。 PHPアプリケーションはUTF8を使用します。 POSTコンテンツをAJAX受信div内のテキストエリアにまっすぐに出力しても、すべてがUTF8で正しくエンコードされています。XPathにUTF8を使用させる方法を教えてください。

私は、XPath

$dom = new DOMDocument(); 
$dom->loadHTML($raw2); 
$xpath = new DOMXPath($dom); 
$query = '//td/text()'; 
$nodes = $xpath->query($query); 
foreach($nodes as $node) { 
    var_dump($node->wholeText); 
} 

を使用して解析しようとする文字列がUTF8ではありませんダンプ。 DOM/XPathにUTF8を使用させるにはどうすればよいですか?

+0

は、あなたが(テスト)の例のHTMLドキュメントを提供することができます碑? – VolkerK

答えて

3

をうまくいく、パラメータとしてのDOMDocumentで構成beeingて)が、負荷()/ loadxml( )。例えば、XHTML文書

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
     <title>xhtml test</title> 
    </head> 
    <body> 
     <h1>A Table</h1> 
     <table> 
      <tr><th>A</th><th>O</th><th>U</th></tr> 
      <tr><td>Ä</td><td>Ö</td><td>Ü</td></tr> 
      <tr><td>ä</td><td>ö</td><td>ü</td></tr> 
     </table> 
    </body> 
</html> 

スクリプト

<?php 
$raw2 = 'test.html'; 

$dom = new DOMDocument(); 
$dom->load($raw2); 
$xpath = new DOMXPath($dom); 
var_dump($xpath->registerNamespace('h', 'http://www.w3.org/1999/xhtml')); 
$query = '//h:td/text()'; 
$nodes = $xpath->query($query); 
foreach($nodes as $node) { 
    foo($node->wholeText); 
} 


function foo($s) { 
    for($i=0; $i<strlen($s); $i++) { 
     printf('%02X ', ord($s[$i])); 
    } 
    echo "\n"; 
} 

プリント

bool(true) 
C3 84 
C3 96 
C3 9C 
C3 A4 
C3 B6 
C3 BC 

すなわち出力/文字列がUTF-8 similに苦しん

+0

私が解析しているページにはがありませんでした。それを追加するためにTidyを使用し、私の問題は解決されました。 – Grod

+0

これは正しいです。私は強い議論を維持している(弱く保持している):それがxhtmlであると主張するなら、それを修正しようとはしない。彼らは前にxを望んでいた、彼らは配信する必要があります。 ;-) – VolkerK

1

私は試していませんが、DOMDocument::__constructの2番目のパラメータはエンコードに関連しているようです。おそらくそれはあなたを助けるでしょう:-)

これ以外の場合は、書き込み可能なencoding property in DOMDocumentがあります。

DOMXPathを使うことの最大は、それはあなたが(loadhtmlを使用してはならない本格的な有効なXHTML文書であれば、多分それは...

+0

'$ dom-> encoding = 'utf8''は効果がなく、' __construct() 'でエンコーディングを設定しませんでした。おそらく 'loadHTML()'を使用している可能性がありますが、わかりません。 – Grod

+0

loadHTML()はコンストラクタのエンコーディングセットをオーバーライドします – leticia

0

をコードしている考える

AR問題(loadHTMLとの組み合わせでUTF-8を使用するXPathを強制することができない)、最後にこの優れた記事は、溶液設け:追加セクション を挿入

http://devzone.zend.com/article/8855

回避策を適切なコンテンツタイプ HTTP-EQUIVメタタグを開きタグ の直後に挿入します。

+0

このリンクは、もはや有効ではありません。それを更新したり、そのページのソリューションをここに貼り付けることはできますか? – user658182

26

私は同じ問題を抱えていたし、私は私のウェブサーバにきちんと使うことができませんでした。 私はこの解決策を見つけ、それがうまく働いた:

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

+1、唯一の提案は2番目の行を上に移動することです(少なくとも私にとっては)混乱していました。 –

+1

私は1年以上このことに悩まされてきました。これをありがとうございました。私は、特別なクラス、ヘッダー、メタ、php.ini、xml utf-8のハックなど、数え切れないほど多くのことを試しました。 –

1

ゲームでは少し遅れて、おそらくそれは、誰かが助け...

問題は、DOMに出力であること、およびない可能性があります/ xpathオブジェクト自体。

nodeValueを直接出力すると、破損した文字が表示されます。:

ìÂÂì ë¹Â디ì¤ 
ìì ë¹ë””ì¤ í°ì íì¤ 

あなたは第二のparam "UTF-8"、new \DomDocument('1.0', 'utf-8')を使用してDOMオブジェクトをロードする必要がありますが、あなたは、DOMノードリスト/要素の値を印刷するとき、まだあなたは壊れた文字を取得します:

echo $contentItem->item($index)->nodeValue

あなたはutf8_decodeでそれをラップする必要が

echo utf8_decode($contentItem->item($index)->nodeValue) //output: 者不終朝而會,愚者可浹旬而學

+0

複数の質問に同じ回答を加えないでください。最良のものに答え、残りを重複としてフラグを立てる。 http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add-a-duplicate-answer-to-several-questionsを参照してください。 –

関連する問題