Tengo un documento XHTML que se pasa a PHP de la aplicación a través de Greasemonkey AJAX. El PHP app usa UTF8. Si he de salida el contenido de la entrada directamente a un textarea en el AJAX de recibir div, todo está correctamente codificado en UTF8.

Cuando intento analizar mediante 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);
}

objeto de dumping, las cadenas no son utf8. ¿Cómo puedo fuerza DOM/XPath para usar UTF8?

  • puede proveer un (a prueba) ejemplo de un documento html?
InformationsquelleAutor Gordon | 2009-07-20

5 Comentarios

  1. 4

    Si es un completo documento xhtml válido que no se debe usar loadhtml() pero load()/loadxml().

    Dado el ejemplo de documento 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>

    la secuencia de comandos

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

    imprime

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

    es decir, la salida de cadenas de caracteres están codificados en utf-8

    • La página que estoy de análisis no ha <?xml ?>. Utiliza Ordenado, para añadir que, y mi problema es resuelto.
    • Eso es correcto. Puedo mantener la fuerte opinión (débilmente retenido): si lo que dice ser xhtml no intente solucionarlo; querían la x en la frente, ellos tienen que entregar. 😉
  2. 31

    Yo tenía el mismo problema y no puedo utilizar ordenado en mi servidor web.
    He encontrado esta solución y funcionó bien:

    $html = mb_convert_encoding($html, 'HTML de las ENTIDADES, "UTF-8"); 
    $dom = new DomDocument(); 
    $dom->loadHTML($html); 
    
    • +1, la única sugerencia es para mover la segunda línea a la parte superior, era confuso (al menos para mí).
    • He estado luchando y con esto durante más de un año. Muchas gracias por esto. He intentado un sinnúmero de cosas que no funcionan: incluye las clases especiales, encabezados, metas, php.ini, xml utf-8 «hacks», y muchos más y nada funcionó para mi problema en particular, excepto este.
  3. 1

    No lo he probado, pero el segundo parámetro de DOMDocument::__construct parece estar relacionado con la codificación ; tal vez las que podrás 🙂

    Los demás, hay un la codificación de los bienes en DOMDocument, que se puede escribir.

    La DOMXpath en muy buen estado, construido con el DOMDocument como parámetro, tal vez voy a trabajar…

    • $dom->encoding = 'utf8' no tuvo ningún efecto, ni tampoco la configuración de la codificación en __construct(). Posiblemente debido a la utilización de loadHTML(), pero no sé.
    • loadHTML() anula la codificación establecida en el constructor
  4. 1

    Un poco tarde en el juego, pero tal vez ayude a alguien…

    El problema podría estar en la salida, y no en el dom/xpath objeto en sí mismo.

    Si sería la salida de la nodeValue directamente, corromperse caracteres por ejemplo:

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

    Tiene que cargar su objeto dom con el segundo parámetro «utf-8», new \DomDocument('1.0', 'utf-8'), pero aún cuando se imprime el nodo dom lista/elemento de valor que obtiene roto caracteres:

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

    tienes que acabarlo con utf8_decode:

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

  5. 0

    Luchado con un problema similar (no a la fuerza Xpath para el uso de UTF-8 en combinación con loadHTML), en la final de este excelente artículo, siempre la solución:
    http://devzone.zend.com/article/8855

    solución:

    Insertar una sección adicional
    con el apropiado tipo de Contenido
    HTTP-EQUIV etiqueta meta inmediatamente
    tras la apertura de la etiqueta.

    • Este enlace no es válido. Se puede actualizar o pegar la solución de la página aquí?

Dejar respuesta

Please enter your comment!
Please enter your name here