2010-02-10 9 views
20
$string = file_get_contents('http://example.com'); 

if ('UTF-8' === mb_detect_encoding($string)) { 
    $dom = new DOMDocument(); 
    // hack to preserve UTF-8 characters 
    $dom->loadHTML('<?xml encoding="UTF-8">' . $string); 
    $dom->preserveWhiteSpace = false; 
    $dom->encoding = 'UTF-8'; 
    $body = $dom->getElementsByTagName('body'); 
    echo htmlspecialchars($body->item(0)->nodeValue); 
} 

Esto cambia todos los caracteres UTF-8 a Å, ¾, ¤ y otros desperdicios. ¿Hay alguna otra manera de preservar los caracteres UTF-8?¿Por qué DOM cambia la codificación?

No publique las respuestas diciéndome que me asegure de que estoy produciendo como UTF-8, me aseguré de hacerlo.

Gracias de antemano :)

+2

dónde viene los datos ('$ string') vienen? –

+0

He actualizado mi pregunta :) –

+0

¿Puede proporcionar un enlace a la URL que obtiene usando file_get_contents()? Como dije en la otra pregunta, sospecho que está obteniendo el ISO-8859-1 o algún otro dato, que * tiene * para distorsionarse cuando sale en UTF-8. No confiaría en mb_detect_encoding(). –

Respuesta

39

tuve problemas similares recientemente, y finalmente encontró esta solución - convertir todos los caracteres no ASCII a html entidades antes de cargar el html

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

WOW. Muchas gracias, funcionó a la perfección. Esto ya me estaba llevando al borde de la locura. –

+1

Esta es una gran solución, pero aún sería interesante averiguar por qué el DOM de su servidor de producción daña el UTF8 en primer lugar. Tal vez algo para preguntarle al administrador, si hay alguno. –

+0

Soy el administrador: D y no tengo idea. Estoy usando una configuración muy común de Debian 5.0 Lenny. Tal vez es una "característica" de seguridad que hace esto? –

4

En caso de duda es el DOM para atornillar la codificación, este truco lo hizo por mí hace un tiempo a la inversa (aceptar datos ISO-8859-1). DOMDocument debe ser UTF-8 por omisión en cualquier caso, pero todavía se puede probar:

$dom = new DOMDocument('1.0', 'utf-8'); 
+1

Esto no ayudó, pero andrewmabbott ya resolvió mi problema - verifique su respuesta;) –

+2

Funciona solo con loadXml(), no con loadHtml(). –

1

En la parte superior de la secuencia de comandos donde sus mentiras código PHP (el código que ha escrito aquí), asegúrese de enviar una cabecera UTF-8. Apuesto a que tu codificación es una variante de latin1 en este momento. Sí, sé que la página web remota es utf8, pero este script php no lo es.

0

he tenido que añadir una cabecera UTF-8 para obtener el punto de vista correcto:

header('Content-Type: text/html; charset=utf-8'); 
Cuestiones relacionadas