NSXMLParser rss issue NSXMLParserInvalidCharacterError
-
05-07-2019 - |
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?
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)];