2012-01-07 10 views
2
$msg = "<body><a>áéíóú☻♥♦♣</a></body>"; 
$temp_dom = new DOMDocument();  
$temp_dom->loadHTML($msg);  
$dom_xpath = new DOMXpath($temp_dom); 
$ele = $dom_xpath->query('//a')->item(0); 

echo "<pre>"; 
echo "Original: $msg\n"; 
echo $ele->nodeValue;  
echo "</pre>"; 

の多くは、出力[?]:XPathエンコーディングの問題を伴うDOMDocument。テスト

Original: áéíóú☻♥♦♣ 
áéíóúâ»â¥â¦â£ 

現在のドキュメントのエンコーディングはUTF-8です。 ANSIも試しましたが、同じ問題が発生しました。

utf8_decodeは問題

echo utf8_decode($ele->nodeValue); 

を解決しかし、事は、私は、属性の多くと私はそれらの一つ一つにutf8_decodeを使用しなければならない多くの機能を使用して、私はそれがないと信じています正しいことをする。 誰かがこれをどうやって行うことができるか知っていますか?

私はすでに多くのことを試したので、結果を投稿する前にこのテストを使用してテストしてください。

は事前にありがとうございました。

+0

[php:私がUTF-8を書くときはいつでもDomDocumentを使って16進表記を書くことができます](http://stackoverflow.com/questions/3575109/php-using-domdocument-whenever-i-試し書きするにはutf-8-it-writes-the-hexadecimal-n) – Gordon

答えて

4

問題は、HTMLが解析されるときにエンコードされる内容をDOMDocumentに伝える必要があることです。 encodingオプションを設定することでこれを行うことはできません。 (私は、文書がどのように出力されるのかについては、saveHTMLと考えています)。

これを行うにはちょっと面白い方法は、文書にエンコーディングのステートメントを挿入することです。これは、解析するHTMLの前に'<?xml encoding="UTF-8">'を挿入することで簡単に行うことができます。

<?php 

$msg = "<body><a>áéíóú☻♥♦♣</a></body>"; 
$temp_dom = new DOMDocument();  


$temp_dom->loadHTML('<?xml encoding="UTF-8">' . $msg);  
$temp_dom->encoding = 'UTF-8'; 
$dom_xpath = new DOMXpath($temp_dom); 
$ele = $dom_xpath->query('//a')->item(0); 

echo "<pre>"; 
echo "Original: $msg\n"; 
echo $ele->nodeValue;  
echo "</pre>"; 

出力:これはドキュメントオブジェクト(正確にはDOMProcessingInstruction)の子として余分なノードを挿入するので、あなたがある場合はこのことを認識することはないことが

<pre>Original: <body><a>áéíóú☻♥♦♣</a></body> 
áéíóú☻♥♦♣</pre> 

注意、 $temp_dom->childNodesなどで何かをしている。

+0

ありがとう。それはまさに私が要求したものです。 ; D実際には、DOCTYPE(<?xml encoding = "UTF-8">)を宣言しているので、XPathでこれを使用してエンコーディングを定義すると考えることはできません。ありがとう。 :) – Grego

関連する問題