Les problèmes de jeu de caractères sont l'un des pièges les plus courants lors de l'utilisation de la fonction XML_PARSE pour traiter les données XML dans PHP. En particulier dans le scénario où les données sont échangées entre les systèmes et les langues, la méthode de codage des fichiers XML peut être incompatible avec le contenu réel, ou est incompatible avec l'environnement PHP, entraînant une défaillance d'analyse. Cet article expliquera en profondeur les causes, les symptômes courants des problèmes de jeu de caractères et les solutions et les méthodes de réparation correspondantes.
Le codage de la déclaration XML est incompatible avec le contenu réel
<?xml version="1.0" encoding="UTF-8"?>
Cette ligne de déclaration signifie que XML est codé à l'aide de l'UTF-8, mais bien que certains fichiers soient marqués en UTF-8, le contenu réel est GBK, ISO-8859-1 et d'autres encodages.
Le jeu de caractères par défaut PHP est incompatible avec XML
Si votre script PHP traite les chaînes dans UTF-8 par défaut, mais que le fichier XML est écrit dans d'autres encodages, XML_PARSE peut avoir une erreur.
La logique de conversion de codage correcte n'est pas définie
La fonction XML_PARSE elle-même ne prend pas en charge la conversion automatique du jeu de caractères. Si le contenu XML entrant n'est pas UTF-8, l'analyse échouera, provoquant des caractères illégaux.
Erreur XML: pas bien formé (jeton non valide)
Erreur XML: caractère non valide
Ces erreurs signifient souvent que le flux de caractères XML que vous fournissez n'est pas au format UTF-8, ou contient des caractères illégaux qui ne peuvent pas être analysés.
Avant l'analyse, les chaînes de XML transcodantes vers UTF-8 sont le moyen le plus courant et le plus sûr. PHP peut être implémenté à l'aide de MB_CONVERT_ENCODING ou ICONV .
$xml_content = file_get_contents("https://m66.net/data/sample.xml");
// Supposons que l'encodage original soit GBK,Différents encodages peuvent être essayés en fonction des conditions réelles
$xml_content_utf8 = mb_convert_encoding($xml_content, 'UTF-8', 'GBK');
$xml_parser = xml_parser_create('UTF-8');
xml_parse($xml_parser, $xml_content_utf8, true);
xml_parser_free($xml_parser);
Remarque: vous devez savoir quel codage est écrit dans le XML original. Deviner le mauvais codage aggravera le problème.
Si vous savez déjà que le contenu d'origine est UTF-8, mais que la déclaration est erronée, vous pouvez utiliser une modification régulière:
$xml_content = file_get_contents("https://m66.net/data/sample.xml");
// remplacer XML La partie d'encodage de la déclaration
$xml_content = preg_replace('/<\?xml(.*?)encoding=["\'][^"\']*["\'](.*?)\?>/i', '<?xml\1encoding="UTF-8"\2?>', $xml_content);
// Continuer à analyser
$xml_parser = xml_parser_create('UTF-8');
xml_parse($xml_parser, $xml_content, true);
xml_parser_free($xml_parser);
Si l'analyse du schéma de sax n'est pas particulièrement nécessaire ( XML_PARSE appartient à ce modèle), vous pouvez envisager d'utiliser Simplexml , ce qui est plus tolérant dans le codage de la manipulation:
$xml_content = file_get_contents("https://m66.net/data/sample.xml");
// Se convertir UTF-8
$xml_content_utf8 = mb_convert_encoding($xml_content, 'UTF-8', 'GB2312');
$xml = simplexml_load_string($xml_content_utf8);
print_r($xml);
UNIFIED UTF-8 Encoder les données de traitement
Assurer la cohérence du codage pendant le stockage
Pour les fichiers XML externes, consultez leur encodage avant de lire
Les journaux d'erreur sont activés pendant le développement pour faciliter les problèmes liés au codage à découvrir en temps opportun
Bien que le problème du jeu de personnage puisse sembler délicat, il n'est pas difficile de résoudre tant que vous comprenez la cause profonde. Lorsque vous utilisez XML_PARSE , le point est de s'assurer que le nouveau sont une chaîne UTF-8 légitime et de transcoder manuellement ou de corriger les déclarations XML si nécessaire. J'espère que cet article vous aide à gérer plus facilement les problèmes d'intégration PHP et XML.