2009-07-20 6 views
5

Tôi có một tài liệu XHTML được chuyển đến một ứng dụng PHP thông qua Greasemonkey AJAX. Ứng dụng PHP sử dụng UTF8. Nếu tôi xuất nội dung POST thẳng về một vùng văn bản trong div nhận AJAX, mọi thứ vẫn được mã hoá đúng theo UTF8.Làm cách nào để buộc XPath sử dụng UTF8?

Khi tôi cố gắng phân tích sử dụng 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); 
} 

đổ chuỗi không phải là utf8. Làm cách nào để buộc DOM/XPath sử dụng UTF8?

+0

bạn có thể cung cấp một (thử nghiệm) ví dụ html doc ument? – VolkerK

Trả lời

3

Nếu nó là một tài liệu xhtml hợp lệ đủ lông đủ cánh bạn không nên sử dụng loadhtml() nhưng load()/LoadXml ().

Với tài liệu ví dụ 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> 

kịch bản

<?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"; 
} 

in

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

ví dụ: sản lượng/chuỗi là utf-8 mã hóa

+0

Trang tôi đang phân tích cú pháp không có . Đã sử dụng Tidy để thêm điều đó và sự cố của tôi được giải quyết. – Grod

+0

Điều đó là chính xác. Tôi duy trì sự phản đối mạnh mẽ (bị giữ yếu): nếu nó tuyên bố là xhtml thì đừng cố sửa nó; họ muốn x ở phía trước, họ phải giao hàng. ;-) – VolkerK

1

Tôi chưa thử, nhưng tham số thứ hai của DOMDocument::__construct dường như có liên quan đến mã hóa; có thể điều đó sẽ giúp bạn :-)

Khác, có một số encoding property in DOMDocument, có thể ghi được.

Các DOMXpath beeing xây dựng với DOMDocument như tham số, có thể nó sẽ làm việc ...

+0

'$ dom-> encoding = 'utf8'' không có hiệu lực, cũng như không đặt mã hóa trong' __construct() '. Có thể do sử dụng 'loadHTML()', nhưng tôi không biết. – Grod

+0

loadHTML() ghi đè bộ mã hóa trong hàm tạo – leticia

0

vật lộn với simil vấn đề ar (không thể buộc XPath sử dụng UTF-8 kết hợp với loadHTML), cuối cùng bài viết tuyệt vời này cung cấp các giải pháp: http://devzone.zend.com/article/8855

workaround:

Chèn một phần bổ sung với thẻ meta HTTP-EQUIV nội dung thích hợp ngay lập tức theo thẻ mở.

+0

Liên kết này không còn hợp lệ. Bạn có thể cập nhật hoặc dán giải pháp từ trang đó ở đây không? – user658182

26

Tôi gặp vấn đề tương tự và tôi không thể sử dụng gọn gàng trong máy chủ web của mình. tôi tìm thấy giải pháp này và nó làm việc tốt:

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

+ 1'd, đề xuất duy nhất là di chuyển dòng thứ hai lên trên cùng, nó gây nhầm lẫn (ít nhất là đối với tôi). –

+1

Tôi đã phải vật lộn với điều này trong hơn một năm. Cám ơn bạn rất nhiều về điều này. Tôi đã thử vô số thứ không hoạt động: bao gồm các lớp đặc biệt, tiêu đề, metas, php.ini, xml utf-8 hack, và nhiều thứ khác và không làm việc cho vấn đề cụ thể của tôi, ngoại trừ điều này. –

1

Một chút trễ trong game, nhưng có lẽ nó sẽ giúp người ...

Vấn đề có thể là trong đầu ra, và không có trong các dom/chính đối tượng xpath.

Nếu bạn sẽ xuất trực tiếp nútValue trực tiếp, bạn sẽ nhận được các ký tự bị hỏng, ví dụ::

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

Bạn phải tải đối tượng dom của bạn với param thứ hai "utf-8", new \DomDocument('1.0', 'utf-8'), nhưng vẫn còn khi bạn in danh sách nút dom/giá trị phần tử bạn nhận được nhân vật bị hỏng:

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

bạn phải quấn nó lên với utf8_decode:

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

+0

Vui lòng không thêm cùng một câu trả lời cho nhiều câu hỏi. Trả lời câu trả lời hay nhất và gắn cờ phần còn lại là trùng lặp. Xem http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add-a-duplicate-answer-to-several-questions –