72 votes

Erreur: "L'entrée n'est pas correcte UTF-8, indiquez un codage!" en utilisant la chaîne simplexml_load_string de PHP

J'obtiens le message d'erreur:

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

Lors du traitement de la réponse XML à l'aide de simplexml_load_string d'un 3ème partie de la source. Le XML brut réponse ne déclarer le type de contenu:

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

Pourtant, il semble que le XML n'est pas vraiment de l'UTF-8. La langue du contenu XML est l'espagnol et contient des mots tels que Dublín dans le XML.

Je ne suis pas en mesure d'obtenir la 3ème partie de trier leurs XML.

Comment puis-je pré-traiter le XML et de fixer l'encodage des incompatibilités?

Est-il un moyen de détecter l'encodage correct pour un fichier XML?

81voto

Josh Davis Points 12974

Votre 0xED 0x6E 0x2C 0x20 octets correspondent à des "ín," ISO-8859-1, donc il semble que votre contenu est en ISO-8859-1, pas en UTF-8. Dites à votre fournisseur de données à ce sujet et leur demander de le réparer, parce que si ça ne fonctionne pas pour vous, il n'a probablement pas travailler pour d'autres personnes.

Maintenant, il ya quelques façons de travailler autour de qui vous ne devez les utiliser si vous ne pouvez pas charger le XML normalement. L'un d'entre eux serait d'utiliser utf8_encode(). L'inconvénient est que si que XML contient à la fois valide UTF-8 et ISO-8859-1 alors le résultat contiendra mojibake. Ou vous pouvez essayer de convertir la chaîne en UTF-8 UTF-8 à l'aide d' iconv() ou mbstring, et de l'espoir qu'ils vont le corriger pour vous. (ils ne sont pas, mais vous pouvez au moins ignorer les caractères non valides afin que vous pouvez charger votre XML)

Ou vous pouvez prendre le long de la route et de valider/corriger les séquences par vous-même. Qui va vous prendre un certain temps selon la façon dont vous vous serez familiarisé avec l'encodage UTF-8. Peut-être il y a des bibliothèques qui ferait que, bien que je ne sais pas tout.

De toute façon, avisez votre fournisseur de données qu'ils envoient des données non valides, de sorte qu'ils peuvent résoudre le problème.


Voici une correction partielle. Il sera certainement pas de tout régler, mais de résoudre certains de il. Espérons-le, assez pour vous d'obtenir par jusqu'à ce que votre fournisseur de fixer leurs trucs.

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]);
}

56voto

Erik Points 601

J'ai résolu cela en utilisant

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

19voto

befox Points 66

Si vous êtes sûr que votre xml est encodé en UTF-8 mais qu'il contient des caractères incorrects, vous pouvez utiliser cette fonction pour les corriger:

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

3voto

Chango Points 46

Au lieu d'utiliser javascript, vous pouvez simplement mettre cette ligne de code après votre phrase mysql_connect:

 mysql_set_charset('utf8',$connection);
 

À votre santé.

2voto

skr Points 21

Si vous téléchargez un fichier XML et l'ouvrez par exemple dans Notepad ++, vous constaterez que l'encodage est défini sur autre chose que UTF8: j'ai le même problème avec xml créé par moi-même, et l'encodage était juste dans l'éditeur :)

La chaîne <?xml version="1.0" encoding="UTF-8"?> ne configure pas l'encodage du document, il ne s'agit que d'informations pour le validateur ou une autre ressource.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X