2009-07-20 27 views
5

Tengo un documento XHTML que se pasa a una aplicación PHP a través de Greasemonkey AJAX. La aplicación PHP usa UTF8. Si entrego el contenido POST directamente a un área de texto en el div receptor AJAX, todo está codificado correctamente en UTF8.¿Cómo forzar a XPath a usar UTF8?

Cuando trato de analizar el uso de 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); 
} 

vierten cadenas no son UTF-8. ¿Cómo obligo a DOM/XPath a usar UTF8?

+0

puede ofrecerle un (a prueba) ejemplo html doc umento? – VolkerK

Respuesta

3

Si se trata de un documento XHTML válido en toda regla que no debe utilizar loadhtml(), pero la carga()/loadXML ()

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

el guió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"; 
} 

grabados

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

es decir, la salida/cadenas son UTF-8 codificado

+0

La página que estoy analizando no tiene . Usé Tidy para agregar eso y mi problema está resuelto. – Grod

+0

Eso es correcto. Mantengo la fuerte opinión (débilmente sostenida): si dice ser xhtml, no trates de arreglarlo; querían la x al frente, tenían que entregar. ;-) – VolkerK

1

No lo he intentado, pero el segundo parámetro de DOMDocument::__construct parece estar relacionado con la codificación; tal vez eso te ayude :-)

De lo contrario, hay un encoding property in DOMDocument, que se puede escribir.

El DOMXPath beeing construido con la DOMDocument como parámetro, tal vez que va a trabajar ...

+0

'$ dom-> encoding = 'utf8'' no tuvo ningún efecto, ni tampoco se configuró la codificación en' __construct() '. Posiblemente debido al uso de 'loadHTML()', pero no sé. – Grod

+0

loadHTML() anula el conjunto de codificación en el constructor – leticia

0

luchado con simil problema ar (no puede forzar Xpath utilizar UTF-8 en combinación con loadHTML), en el extremo este excelente artículo proporcionó la solución: http://devzone.zend.com/article/8855

solución:

insertar una sección adicional con el tipo de contenido apropiado metaetiqueta HTTP-EQUIV inmediatamente siguiendo la etiqueta de apertura.

+0

Este enlace ya no es válido. ¿Puedes actualizarlo o pegar la solución desde esa página aquí? – user658182

26

Tuve el mismo problema y no pude usar ordenado en mi servidor web. me encontré con esta solución y funcionó bien:

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

+1, la única sugerencia es mover la segunda línea a la parte superior, era confuso (al menos para mí). –

+1

He estado luchando con esto por más de un año. Muchas gracias por esto. He intentado innumerables cosas que no funcionaron: incluidas clases especiales, encabezados, metas, php.ini, xml utf-8 hacks, y muchas más y nada funcionó para mi problema en particular, excepto esto. –

1

Un poco tarde en el juego, pero quizás ayude a alguien ...

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

Si imprimiera directamente nodeValue, obtendría caracteres dañados, p.:

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

Usted 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 valor de lista de nodos DOM/elemento se obtiene caracteres rotos:

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

hay que envolverlo con utf8_decode:

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

+0

No agregue la misma respuesta a varias preguntas. Responda el mejor y marque el resto como duplicados. Ver http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add-a-duplicate-answer-to-several-questions –

Cuestiones relacionadas