Estoy tratando de analizar algo de HTML usando DOMDocument, pero cuando lo hago, de repente pierdo mi codificación (al menos así es como me parece).
$profile = "<div><p>various japanese characters</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $div) {
echo $dom->saveHTML($div);
}
El resultado de este código es que obtengo un montón de caracteres que no son japoneses. Sin embargo, si lo hago:
echo $profile;
Se muestra correctamente. He intentado saveHTML y saveXML, y ninguno se muestra correctamente. Estoy usando PHP 5.3.
Lo que veo:
ã¤ãªãã¤å·ã·ã«ã´ã«ã¦ãã¢ã¤ã«ã©ã³ãç³»ã®å®¶åºã«ã9人åå¼ã®5çªç®ã¨ãã¦çã¾ãããå½¼ãå«ãã¦4人ã俳åªã«ãªã£ããç¶è¦ªã¯æ¨æã®ã»ã¼ã«ã¹ãã³ã§ãæ¯è¦ªã¯éµä¾¿å±ã®å®¢å®¤ä¿ã ã£ããé«æ ¡æ代ã¯ãã£ãã£ã®ã¢ã«ãã¤ãã«å¤ãã¿ãæè²è³éãåããªããã«ããªãã¯ç³»ã®é«æ ¡ã¸é²å¦ã
Lo que se debe mostrar:
イリノイ州シカゴにて、アイルランド系の家庭に、9人兄弟の5番目として生まれる。彼を含めて4人が俳優になった。父親は木材のセールスマンで、母親は郵便局の客室係だった。高校時代はキャディのアルバイトに勤しみ、教育資金を受けながらカトリック系の高校へ進学
EDITAR: he simplificado el código a cinco líneas para que pueda probarlo usted mismo.
$profile = "<div lang=ja><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
echo $dom->saveHTML();
echo $profile;
Aquí está el html que se devuelve:
<div lang="ja"><p>イリノイ州シカゴã«ã¦ã€ã‚¢ã‚¤ãƒ«ãƒ©ãƒ³ãƒ‰ç³»ã®å®¶åºã«ã€</p></div>
<div lang="ja"><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>
php
utf-8
character-encoding
Ligeramente A.
fuente
fuente
Respuestas:
DOMDocument::loadHTML
tratará su cadena como si estuviera en ISO-8859-1 a menos que le indique lo contrario. Esto da como resultado que las cadenas UTF-8 se interpreten incorrectamente.Si su cadena no contiene una declaración de codificación XML, puede anteponer una para que la cadena sea tratada como UTF-8:
Si no puede saber si la cadena ya contendrá dicha declaración, hay una solución en SmartDOMDocument que debería ayudarlo:
Esta no es una gran solución, pero dado que no todos los caracteres se pueden representar en ISO-8859-1 (como estas katana), es la alternativa más segura.
fuente
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
lo arregló para mí en PHP7 (por lo que sigue siendo un problema): este es un problema realmente molesto, porque definí utf8 en el documento HTML (con<meta charset="UTF-8" />
) pero eso no tiene ningún efecto, parece necesitar la parte <? xml, que Es totalmente poco intuitivo.$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
¡Funciona genial! Gracias,El problema es con
saveHTML()
ysaveXML()
, ambos no funcionan correctamente en Unix. No guardan los caracteres UTF-8 correctamente cuando se usan en Unix, pero funcionan en Windows.La solución es muy simple:
Si prueba el valor predeterminado, obtendrá el error que describió
Todo lo que tiene que hacer es guardar de la siguiente manera:
Esta línea de código hará que sus caracteres UTF-8 se guarden correctamente. Use la misma solución si la está usando
saveXML()
.Actualizar
Según lo sugerido por " Jack M " en la sección de comentarios a continuación, y verificado por " Pamela " y " Marco Aurélio Deleu ", la siguiente variación podría funcionar en su caso:
Nota
Los caracteres en inglés no causan ningún problema cuando se usa
saveHTML()
sin parámetros (porque los caracteres en inglés se guardan como caracteres de un solo byte en UTF-8)El problema ocurre cuando tiene caracteres de varios bytes (como chino, ruso, árabe, hebreo, etc.).
Recomiendo leer este artículo: http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/ . Comprenderá cómo funciona UTF-8 y por qué tiene este problema. Le llevará unos 30 minutos, pero es un tiempo bien empleado.
fuente
$str = utf8_decode($dom->saveHTML($dom->documentElement));
utf8_decode($dom->saveHTML($dom->documentElement));
Lo hizo perfectamente para mí.Asegúrese de que el archivo fuente real se guarde como UTF-8 (incluso puede probar los caracteres BOM no recomendados con UTF-8 para asegurarse).
También en el caso de HTML, asegúrese de haber declarado la codificación correcta usando
meta
etiquetas:Si se trata de un CMS (como ha etiquetado su pregunta con Joomla), es posible que deba configurar los ajustes adecuados para la codificación.
fuente
<meta charset="UTF-8">
etiqueta más nueva no funciona con DOMDocument.Puede prefijar una
utf-8
codificación de imposición de línea , como esta:Y luego puede continuar con el código que ya tiene, como:
fuente
Me tomó un tiempo darme cuenta, pero aquí está mi respuesta.
Antes de usar DomDocument, usaría file_get_contents para recuperar las URL y luego procesarlas con funciones de cadena. Quizás no sea la mejor manera pero rápido. Después de convencerme de que Dom era igual de rápido, probé lo siguiente:
Esto falló espectacularmente al preservar la codificación UTF-8 a pesar de las metaetiquetas adecuadas, la configuración de php y todos los demás remedios ofrecidos aquí y en otros lugares. Esto es lo que funciona:
etc. Ahora todo está bien con el mundo. Espero que esto ayude.
fuente
DomDocument('1.0', 'UTF-8')
. Pero en mi caso solo se carga html parcial.Debe alimentar el DOMDocument con una versión de su HTML con un encabezado que tenga sentido. Al igual que HTML5.
tal vez sea una buena idea mantener su html tan válido como sea posible, para que no tenga problemas cuando comience la consulta ... alrededor de :-) y ¡¡manténgase alejado de
htmlentities
!!!! Ese es un desperdicio necesario de recursos. mantén tu código loco !!!!fuente
Estoy usando php 7.3.8 en un manjaro y estaba trabajando con contenido persa. Esto resolvió mi problema:
fuente
Funciona para mí:
fuente
?
)Úselo para obtener el resultado correcto
Esta operacion
Es una mala manera, porque símbolos especiales como & lt; , & gt; puede estar en $ profile y no se convertirán dos veces después de mb_convert_encoding. Es el agujero para XSS y HTML incorrecto.
fuente
Lo único que funcionó para mí fue la respuesta aceptada de
SIN EMBARGO
Esto provocó nuevos problemas, de tener
<?xml encoding="utf-8" ?>
en la salida del documento.La solución para mí era hacer
Algunas soluciones me dijeron que para eliminar el
xml
encabezado, tenía que realizarEsto no funcionó para mí como para un documento parcial (por ejemplo, un documento con dos
<p>
etiquetas), solo una de las<p>
etiquetas fue devuelta.fuente
El problema es que cuando agrega un parámetro a la función DOMDocument :: saveHTML (), pierde la codificación. En algunos casos, deberá evitar el uso del parámetro y utilizar la función de cadena antigua para encontrar lo que está buscando.
Creo que la respuesta anterior funciona para usted, pero como esta solución no funcionó para mí, estoy agregando esa respuesta para ayudar a las personas que pueden estar en mi caso.
fuente
También puede codificar como a continuación ... recopilado de https://davidwalsh.name/domdocument-utf8-problem
fuente