2012-01-07 2 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

가능한 중복 : (http://stackoverflow.com/questions/3575109/php-using-domdocument-whenever-i- [PHP 내가 작성하려고 할 때마다있는 DOMDocument를 사용은 UTF-8 그것의 16 진수 표기를 기록] 쓰기 -Unf-8-it-written-the-16 진수 -n) – Gordon

답변

4

문제는 HTML이 구문 분석 될 때 인코딩이 무엇인지 DOMDocument에 알려줘야한다는 것입니다. encoding 옵션을 설정하면이 작업을 수행 할 수 없습니다. (나는 그 문서가 saveHTML으로 출력되는 방법에 영향을 미친다고 믿는다.)

약간의 hackish 방법은 문서에 인코딩의 진술을 삽입하는 것이다. 구문 분석 할 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>"; 

출력 : 당신이 경우

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

주,이 문서 객체의 자식으로 추가 노드를 삽입한다는 것을 (A DOMProcessingInstruction가 정확하기) 때문에,이 인식 $temp_dom->childNodes 등으로 무엇이든 할 수 있습니다. 의

+0

감사합니다. 그게 바로 제가 요청한 것입니다. ; D 사실이 속임수는 DOCTYPE ()을 선언하고 있기 때문에 XPath가 이것을 사용하여 인코딩을 정의 할 수 있다고 생각하지 못했습니다. 감사. :) – Grego