Question

NSXMLParserInvalidCharacterError # 9

C’est l’erreur que j’obtiens lorsque je frappe un caractère étrange (comme des citations copiées et collées d’un mot au formulaire Web, qui se retrouvent dans le fil d’alimentation). Le flux que j'utilise ne donne pas d'encodage et il n'y a pas d'espoir pour moi de le faire changer cela. C'est tout ce que j'ai dans l'en-tête:

< ? xml version = " 1.0 "? > < version rss = & "2.0 &"; >

Que puis-je faire à propos des caractères illégaux lors de l'analyse de flux? Est-ce que je balaye les données avant l'analyse? Y a-t-il quelque chose qui me manque dans l'API? Quelqu'un a-t-il traité ce problème?

Était-ce utile?

La solution

NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

Résolu mes problèmes ...

Autres conseils

La méthode NSString -initWithData:encoding: renvoie nil en cas d'échec, vous pouvez donc essayer un codage après l'autre jusqu'à ce que vous en trouviez un qui soit converti. Cela ne garantit pas que tous les caractères seront convertis correctement, mais si votre source de flux ne vous envoie pas correctement le code XML codé, vous devrez probablement vivre avec.

L'idée de base est la suivante:

// try the most likely encoding
NSString xmlString = [[NSString alloc] initWithData:xmlData 
                                           encoding:NSUTF8StringEncoding];

if (xmlString == nil) {
  // try the next likely encoding
  xmlString = [[NSString alloc] initWithData:xmlData 
                                     encoding:NSWindowsCP1252StringEncoding];
}

if (xmlString == nil) {
  // etc...
}

Pour être générique et robuste, vous pouvez effectuer les opérations suivantes jusqu'à ce que l'opération aboutisse:

1.) Essayez le codage spécifié dans l'en-tête Content-Type de la réponse HTTP (le cas échéant)

2.) Vérifiez le début des données de réponse pour un repère d'ordre de byte . et si trouvé, essayez le codage indiqué

3.) Regardez les deux premiers octets; si vous trouvez un caractère d'espacement ou '<' associé à un caractère nul / nul, essayez UTF-16 (de même, vous pouvez vérifier les quatre premiers octets pour voir si vous avez UTF-32)

4.) Analysez le début des données à la recherche de l'instruction de traitement <?xml ... ?> et recherchez encoding='something' à l'intérieur de celle-ci; essayez cet encodage.

5.) Essayez quelques encodages courants. Vérifiez définitivement Windows Latin-1, Mac Roman et ISO Latin-1 si votre source de données est en anglais.

6.) Si rien de ce qui précède ne fonctionne, vous pouvez essayer de supprimer tous les octets supérieurs à 127 (ou de remplacer "?" ou un autre caractère ASCII) et de convertir les données en utilisant le codage ASCII.

Si vous n'avez pas de NSString à ce stade, vous devriez échouer. Si vous avez une chaîne NSString, vous devez rechercher la déclaration encoding dans l'instruction de traitement CFStringConvertIANACharSetNameToEncoding() (si vous ne l'avez pas déjà fait à l'étape 4). Si tel est le cas, vous devriez reconvertir NSString en NSData en utilisant cet encodage; si ce n'est pas le cas, vous devriez reconvertir en utilisant le codage UTF-8.

De plus, les fonctions CFStringConvertEncodingToNSStringEncoding() et Content-Type peuvent vous aider à obtenir le code NSStringEncoding qui accompagne le nom du codage dans l'en-tête <=> ou l'instruction <=> de traitement.

Vous pouvez également supprimer cette ligne d'encodage du fichier XML comme ceci:

int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
                        withString:@""
                        options:NSRegularExpressionSearch 
                        range:NSMakeRange(0, length)];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top