2010-02-28 3 views
4

Je commence avec une XML qui ressemble à ceci (simplifié):XML Parse avec des caractères spéciaux (UTF-8)

<?xml version="1.0" encoding="UTF-8"?> 
<alldata> 
    <data name="Forsetì" /> 
</alldata> 
</xml> 

Mais après que je l'ai analysé avec simplexml_load_string le caractère spécial (le i) devient: ì ce qui est évidemment assez mutilé.

Y a-t-il un moyen d'empêcher cela de se produire?

Je sais pertinemment que le code XML est correct, lorsqu'il est enregistré au format .txt et affiché dans le navigateur, les caractères sont corrects. Lorsque j'utilise simplexml_load_string sur le XML, puis enregistrez les valeurs sous forme de fichier texte ou dans la base de données, il est tronqué.

+2

Etes-vous sûr de l'encodage sur la page d'affichage est correcte? – jasonbar

Répondre

6

Cela ressemble SimpleXML crée une chaîne UTF-8, qui est ensuite rendu dans la norme ISO-8859-1 (latin-1) ou quelque chose près comme CP-1252. Lorsque vous enregistrez le résultat dans un fichier et que vous le diffusez via un serveur Web, le navigateur utilise l'encodage déclaré dans le fichier.

Y compris dans une page web
Depuis votre page web encodage n'est pas UTF-8, vous devez convertir la chaîne dans l'encodage que vous utilisez, par exemple ISO-8859-1 (latin-1).

Cela se fait facilement avec iconv():

$xmlout = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $xmlout); 

Enregistrement à la base de données
colonne de base de données n'utilise pas le classement UTF-8, vous devez donc utiliser iconv pour convertir la chaîne à la charset que votre base de données utilise.

En supposant que le classement de votre base de données est le même que celui dans lequel vous effectuez le rendu, vous n'aurez rien à faire lors de la lecture de la base de données.

Explication
En UTF-8, un octet de préfixe de 0xC2 est utilisé pour accéder à la moitié supérieure du bloc « Latin-1 Supplément », qui comprend des caractères tels que des lettres accentuées, symboles monétaires, des fractions, superscript 2 et 3, les symboles de droits d'auteur et de marque déposée, et l'espace insécable.

Toutefois, dans ISO-8859-1, l'octet 0xC2 représente un Â. Donc quand votre chaîne UTF-8 est mal interprétée comme l'une d'entre elles, alors vous obtenez  suivi par un autre caractère non-sens.

0

Il est très probable que le code XML est correct, mais le caractère est altéré lorsqu'il est stocké ou sorti.

Si vous produisez des données sur une page HTML: Assurez-vous que le codage est également effectué en UTF-8. Si votre page HTML est en ISO-8859-1, vous pouvez utiliser utf8_decode comme solution rapide; UTF-8 est la meilleure option à long terme.

Si vous stockez les données dans un mySQL, vous devez avoir sélectionné UTF8 comme encodage: En tant qu'encodage de la connexion, dans la table et dans la ou les colonnes, vous insérez les données dans .

+0

Je sais pertinemment que le XML est bon, lorsqu'il est enregistré en .txt et vu dans le navigateur, les caractères sont corrects. Lorsque j'utilise simplexml_load_string sur le XML, puis enregistrez les valeurs sous forme de fichier texte ou dans la base de données, il est tronqué. – Stomped

0

J'ai aussi eu quelques problèmes avec ceci, et cela vient du codage de script PHP. Assurez-vous qu'il est réglé sur UTF-8. Si ce n'est toujours pas le cas, essayez d'imprimer la variable en utilisant uft8_encode ou utf8_decode.

0

XML est stricte en ce qui concerne les entités, comme & devrait être &amp;amp; et je &amp;igrave;

vous aurez donc besoin d'une table de traduction.

function xml_entity_decode($_string) { 
    // Set up XML translation table 
    $_xml=array(); 
    $_xl8=get_html_translation_table(HTML_ENTITIES,ENT_COMPAT); 
    while (list($_key,)=each($_xl8)) 
     $_xml['&#'.ord($_key).';']=$_key; 
    return strtr($_string,$_xml); 
} 
+3

Les seuls caractères * requis * à remplacer par des entités en XML sont les cinq caractères de balisage de base: esperluette, apostrophe, guillemet et les chevrons. D'autres peuvent devoir être remplacés si l'encodage du document ne les supporte pas, mais ce n'est pas un problème avec UTF-8. –

0

En retard à la fête ... Mais j'ai fait face à ceci et résolu comme ci-dessous.

Vous avez déclaré le codage en XML, donc si vous chargez le fichier xml en utilisant DOMDocument cela ne causera aucun problème.

Mais dans le cas où il arrive dans d'autres cas d'utilisation, vous pouvez utiliser html_entity_decode comme ci-dessous:

html_entity_decode($xml->saveXML()); 
Questions connexes