2010-03-21 8 views
3

Je suis dans le nsxmlparser et je me demande comment je peux analyser ISO-8859-1 correctement dans un NSString.Analyse syntaxique ISO-8859-1 w/NSXmlParser

Actuellement, je reçois des résultats w/Â pour les caractères de deux octets.

Le XML J'utilise (pas créé par moi) commence par <?xml version="1.0" encoding="ISO-8859-1"?>

Voici les appels de base que je utilise (omis le NSThread appelle).

NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:sampleFileName ofType:@"xml"]; 

NSString *xmlFileContents = [NSString stringWithContentsOfFile:xmlFilePath encoding:NSUTF8StringEncoding error:nil]; 

NSData *data = [xmlFileContents dataUsingEncoding:NSUTF8StringEncoding]; 

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 

[parser setDelegate:self]; 

[parser parse]; 
+0

Votre fichier XML est-il UTF-8? – zneak

+0

Il semblerait que votre encodage source soit au moins partiellement UTF-8. Je recommande de poster un échantillon (ou un lien vers un échantillon) afin qu'il puisse être diagnostiqué plus tard. –

+0

Je vois en haut la ligne . Je suppose que c'est l'encodage? Comment définir NSXmlParser pour l'utiliser? – Ternary

Répondre

3

Le XML specificationrecommande une explicite character encoding declaration dans le document Prolog. Votre document d'entrée en a probablement un; cela vous indiquera le codage que l'analyseur doit utiliser pour interpréter l'entrée de caractères.

En l'absence d'une déclaration explicite, la même section dit à traiter l'entrée en UTF-8 ou UTF-16 (et le document est en erreur si elle se révèle ne pas être codé comme l'un de ces) . Par conséquent, si votre analyseur XML ignore la déclaration de codage explicite ou utilise un codage incorrect en l'absence de déclaration explicite, votre analyseur est Doing It Wrong ™ et doit être corrigé pour être conforme à la spécification XML.

+0

Ah d'accord. Ça a du sens. Désolé, je suis un peu nouveau à ce sujet. Donc en haut de mon document XML est la ligne . C'est l'encodage, n'est-ce pas? Donc je dois dire cela à NSXmlParser? – Ternary

+0

Notez que la spécification XML n'exige pas que l'analyseur comprenne autre chose que UTF-8 et UTF-16 (section 2.2). Je n'ai jamais utilisé l'analyseur XML en question, donc je ne sais pas avec certitude, mais il pourrait être le cas que NSXmlParser ne supporte rien au-delà de cela. –

0

On dirait que votre en-tête pense que c'est ISO-8859-1 et du comportement (se terminant par deux caractères au lieu d'un), il semble qu'au moins une partie de votre contenu est déjà UTF-8. Cela ressemble à un "problème d'encodage double utf-8" classique où le contenu déjà encodé en UTF-8 est de nouveau encodé en UTF-8. Changer l'en-tête pour dire UTF-8 et il pourrait juste commencer à travailler. Vous pouvez toujours essayer de faire passer votre code en UTF-8, puis en ce qu'il dit (car si ce n'est pas UTF-8, vous obtiendrez une erreur d'analyseur). Enfin, notez que l'encodage d'un fichier XML est remplacé par l'en-tête HTTP s'il est servi sur HTTP.

Je ne sais pas si cela s'applique à votre besoin, mais j'aime cet article sur parsing XML at all costs. A titre d'exemple, je ferai remarquer que j'aime aussi feedparser (Python) comme étant le meilleur parseur XML à tout prix XML (idéal pour les idées mais pas pour votre situation).

+0

Bonne info merci. Donc, si j'ai un lien http vers un fichier XML, quel est le moyen facile d'obtenir ce fichier téléchargé localement pour que je puisse le consulter sans que HTTP ne le modifie? J'ai essayé dans Safari mais je ne l'ai pas encore trouvé. – Ternary

+0

À des fins de débogage, j'ai tendance à utiliser curl ou wget sur la ligne de commande et à leur montrer les en-têtes.Dans un navigateur, j'utiliserai Firefox avec une extension comme FireBug pour montrer les en-têtes. Pour visualiser le contenu dans le navigateur, je fais un clic droit dessus et sélectionnez "Afficher la source". –