Как заставить XPath использовать UTF8? - PullRequest
6 голосов
/ 20 июля 2009

У меня есть документ XHTML, передаваемый в приложение PHP через Greasemonkey AJAX. Приложение PHP использует UTF8. Если я выведу содержимое POST обратно в текстовую область в получающем div AJAX, все по-прежнему будет правильно кодироваться в 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?

Ответы [ 5 ]

30 голосов
/ 22 июля 2010

У меня была такая же проблема, и я не мог использовать tidy в своем веб-сервере. Я нашел это решение, и оно работало нормально:

$html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8");
$dom = new DomDocument();
$dom->loadHTML($html); 
3 голосов
/ 20 июля 2009

Если это полноценный действительный документ xhtml, вы не должны использовать loadhtml (), а load () / 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

1 голос
/ 12 сентября 2016

Немного опоздал в игре, но, возможно, это кому-то поможет ...

Возможно, проблема в выходных данных, а не в самом объекте dom / xpath.

Если вы выведете nodeValue напрямую, вы получите поврежденные символы, например ::10000*

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

Вы должны загрузить свой объект dom вторым параметром "utf-8", new \DomDocument('1.0', 'utf-8'), но при печати значения списка / элемента узла dom вы получите неработающие символы:

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

Вы должны обернуть его с помощью utf8_decode:

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

1 голос
/ 20 июля 2009

Я не пробовал, но второй параметр DOMDocument::__construct, похоже, связан с кодировкой; может быть, это поможет вам: -)

Иначе, есть свойство кодирования в DOMDocument , которое доступно для записи.

DOMXpath создается с параметром DOMDocument, возможно, он будет работать ...

0 голосов
/ 23 июня 2010

Боролась с подобной проблемой (неспособной заставить Xpath использовать UTF-8 в сочетании с loadHTML), в конце концов эта превосходная статья предоставила решение: http://devzone.zend.com/article/8855

Обойти:

Вставить дополнительный раздел с соответствующим типом контента Метатег HTTP-EQUIV немедленно после открывающего тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...