2013-04-15 2 views
0

Similaire à ceci question Je consomme un produit XML qui contient des caractères illégaux. Je doute sérieusement que je puisse les amener à résoudre le problème, mais je vais essayer. En attendant, j'aimerais une solution de rechange.Bullet "•" en XML

Le problème est qu'il contient une balle. Il se traduit par "â € ¢" dans ma source. J'ai essayé quelques conversions d'encodage mais je n'ai pas trouvé de combinaison qui fonctionne. (Je ne suis pas habitué à penser à mon type d'encodage, donc je suis hors de mon élément ici.) Donc, j'ai essayé ci-dessous et il semble que str_replace ne reconnaît pas le "•". (il se transforme en bloc de haut dans mon éditeur de texte) Vous pouvez voir les lignes commentées où j'ai essayé quelques choses différentes.

J'ai essayé str remplacer le « â € ¢ » d'abord, puis peaufiné autour et voici mon dernier:

// deal with bullets in XML. 
$bullet="•"; //this was copied and pasted from transliterated text. 
//$data=iconv("UTF-8", "windows-1252//TRANSLIT", $data); //transliterate the text: 
//$data=str_replace($bullet,'•',$data); // replace the bullet char 
$data=str_replace($bullet,' - ',$data); // replace the bullet char 
//$data=iconv("windows-1252", "UTF-8", $data); // return the text to utf-8 encoding. 

Toute idée comment enlever ou remplacer ce charbon? S'il y a une fonction pour pré-nettoyer le XML, ce serait génial, et je n'aurais pas à m'inquiéter à ce sujet.

+0

Etes-vous sûr qu'il n'y a pas d'autres caractères dans '$ data' qui pourraient causer l'erreur? Que faire si vous essayez de lire le document en utilisant 'DOMDocument :: loadHtml()'? cette méthode est beaucoup plus indulgente si le xml n'est pas valide – hek2mgl

+0

U + 2022 est un [caractère légal en XML] (http://www.w3.org/TR/2000/REC-xml-20001006#charsets). Mais, ce n'est pas valide dans un jeton de nom. Comment est-il utilisé? –

+0

jetez un coup d'œil à [this post] (http://stackoverflow.com/questions/11768839/utf-8-decode-for-php) et [cette ressource, sect. 3] (http://blog.loftdigital.com/blog/php-utf-8-cheatsheet) - ils vous disent comment configurer php pour utiliser l'encodage utf-8 par défaut et comment convertir entre différents encodages si vous avez besoin pour faire cela au cas par cas (mais vous devriez vraiment vous demander _why_ vous devez faire cela). – collapsar

Répondre

8

XML par définition n'a pas de caractères illégaux. Si une chaîne contient un caractère qui ne fait pas partie de XML, cette chaîne n'est pas XML par définition.

Le personnage qui vous préoccupe fait partie d'Unicode. Comme XML est basé sur Unicode, c'est une bonne nouvelle. Alors le nom de ce que vous visez:

Vous dites maintenant qu'il rend comme •. Parce que U + 2022 est codé comme 0xE2 0x80 0xA2 en UTF-8, il est plus ou moins sûr de dire que vous prenez une chaîne codée en UTF-8 (c'est le codage par défaut utilisé en XML btw) mais commandez le logiciel rend la traiter comme un codage unique octet tournant donc le seul code points en trois caractères différents:

au lieu de cela, vous devez commander la application de rendu ion d'utiliser le codage UTF-8. Cela devrait immédiatement résoudre votre problème. Alors, trouvez l'endroit où vous introduisez le mauvais encodage, vous n'aurez probablement pas besoin de le ré-encoder, juste pour indiquer correctement l'encodage.

Si vous vous demandez quels encodages de caractères mono-octet ont ces trois caractères Unicode aux octets correspondants (0xE2 0x80 0xA2), voici une liste.Je l'ai mis en évidence l'un des plus populaires de ces derniers:

  • ISO-8859-15 (Latin 9)
  • OEM 858 (multilingue latine I + Euro)
  • de Windows 1252 (Latin I)
  • de Windows 1254 (turc)
  • de Windows 1256 (arabe)
  • de Windows 1258 (Vietnam)
+0

Votre texte en gras ci-dessus correspond à mon document. Il dit '' Je n'ai pas encore essayé de le changer. Je pourrais, mais je suis préoccupé par les conséquences involontaires. Donc, je cherchais une solution de rechange. C'est pour le travail et le patron dit que ce n'est pas assez important, alors je vais le laisser tomber, mais accepter cette réponse de toute façon. En ce qui concerne votre premier paragraphe, il y a suffisamment de résultats sur une recherche Google pour "[xml remove illegal characters] (http://goo.gl/AQTjo)" pour me faire croire que le reste du monde de codage n'est pas d'accord. – TecBrat

+0

La solution à mon problème actuel, jusqu'à ce que je puisse éditer un tas de fichiers individuels, était d'ajouter 'AddDefaultCharset UTF-8' dans mon fichier .htaccess (apache) Le reste du site ne semble pas avoir souffert de ce changement de charset forcé et il a réparé mes balles cassées. – TecBrat