php xml encoding character-encoding simplexml

Error: "La entrada no es correcta UTF-8, ¡indique la codificación!" Usando la cadena simplexml_load_string de PHP



encoding character-encoding (10)

¿Puedes abrir la fuente XML de terceros en Firefox y ver lo que detecta automáticamente como codificación? Tal vez están usando el viejo ISO-8859-1, UTF-16 o algo más.

Sin embargo, si declaran que es UTF-8 y sirven algo diferente, su alimentación está claramente rota. Trabajar en torno a un suministro tan roto me parece horrible (aunque a veces sea inevitable, lo sé).

Si se trata de un caso simple como "UTF-8 versus ISO-8859-1", también puedes probar tu suerte con mb_detect_encoding() .

Me aparece el error:

parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xED 0x6E 0x2C 0x20

Al tratar de procesar una respuesta XML utilizando simplexml_load_string de una fuente de terceros. La respuesta XML sin formato declara el tipo de contenido:

<?xml version="1.0" encoding="UTF-8"?>

Sin embargo, parece que el XML no es realmente UTF-8. El lenguaje del contenido XML es español y contiene palabras como Dublín en el XML.

No puedo hacer que el tercero solucione su XML.

¿Cómo puedo preprocesar el XML y corregir las incompatibilidades de codificación?

¿Hay alguna forma de detectar la codificación correcta para un archivo XML?


Al generar archivos de mapeo usando doctrina, encontré el mismo problema. Lo arreglé quitando todos los comentarios que algunos campos tenían en la base de datos.


Después de varios intentos, encontré que la función htmlentities funciona.

$value = htmlentities($value)


En lugar de usar javascript, simplemente puede poner esta línea de código después de su oración mysql_connect:

mysql_set_charset(''utf8'',$connection);

Aclamaciones.


Lo solucioné usando

$content = utf8_encode(file_get_contents(''http://example.com/rss.xml'')); $xml = simplexml_load_string($content);


Recientemente nos encontramos con un problema similar y no pudimos encontrar nada obvio como la causa. Resultó ser un caracter de control en nuestra cadena, pero cuando sacamos esa cadena al navegador, ese carácter no era visible a menos que copiéramos el texto en un IDE.

Nos las arreglamos para resolver nuestro problema gracias a esta publicación y esto:

preg_replace (''/ [/ x00- / x1F / x7F] /'', '''', $ input);


Si descargas un archivo XML y lo abres, por ejemplo, en Notepad ++, verás que la codificación está configurada en algo más que UTF8. He tenido el mismo problema con xml y solo he codificado en el editor :)

String <?xml version="1.0" encoding="UTF-8"?> No configura la codificación del documento, solo es información para el validador u otro recurso.


Si está seguro de que su xml está codificado en UTF-8 pero contiene caracteres incorrectos, puede usar esta función para corregirlos:

$content = iconv(''UTF-8'', ''UTF-8//IGNORE'', $content);


Sus 0xED 0x6E 0x2C 0x20 bytes corresponden a "ín", en ISO-8859-1, por lo que parece que su contenido está en ISO-8859-1, no en UTF-8. Cuéntele a su proveedor de datos y pídales que lo solucionen, porque si no funciona para usted probablemente tampoco funcione para otras personas.

Ahora hay algunas formas de solucionarlo, que solo debe usar si no puede cargar el XML normalmente . Uno de ellos sería usar utf8_encode() . El inconveniente es que si ese XML contiene tanto UTF-8 válido como ISO-8859-1, el resultado contendrá mojibake . O puede intentar convertir la cadena de UTF-8 a UTF-8 utilizando iconv() o mbstring, y espero que lo arreglen por usted. (No lo harán, pero al menos puede ignorar los caracteres no válidos para que pueda cargar su XML)

O puede tomar el largo, largo camino y validar / arreglar las secuencias usted mismo. Eso le llevará un tiempo dependiendo de qué tan familiarizado esté con UTF-8. Quizás haya bibliotecas por ahí que harían eso, aunque no conozco ninguna.

De cualquier manera, notifique a su proveedor de datos que están enviando datos no válidos para que puedan repararlo.

Aquí hay una solución parcial. Definitivamente no arreglará todo, pero arreglará algo de eso. Con suerte lo suficiente para que pueda sobrevivir hasta que su proveedor arregle sus cosas.

function fix_latin1_mangled_with_utf8_maybe_hopefully_most_of_the_time($str) { return preg_replace_callback(''#[//xA1-//xFF](?![//x80-//xBF]{2,})#'', ''utf8_encode_callback'', $str); } function utf8_encode_callback($m) { return utf8_encode($m[0]); }


acabo de tener este problema. Resulta que el archivo XML (no el contenido) no estaba codificado en utf-8, sino en ISO-8859-1. Puede verificar esto en una Mac con el file -I xml_filename .

Utilicé Sublime para cambiar la codificación del archivo a utf-8, y lxml importó sin problemas.