NSXMLParser rss issue NSXMLParserInvalidCharacterError
-
05-07-2019 - |
Domanda
NSXMLParserInvalidCharacterError # 9
Questo è l'errore che ottengo quando colpisco un personaggio strano (come virgolette copiate e incollate dalla parola al modulo web, che finiscono nel feed). Il feed che sto usando non sta dando una codifica, e la loro non è alcuna speranza per me di farli cambiare. Questo è tutto ciò che ottengo nell'intestazione:
lt &; ? xml version = " 1.0 "? > lt &; rss version = " 2.0 " >
Cosa posso fare per i personaggi illegali durante l'analisi dei feed? Devo spazzare i dati prima dell'analisi? C'è qualcosa che mi manca nell'API? Qualcuno ha affrontato questo problema?
Soluzione
NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
Risolti i miei problemi ...
Altri suggerimenti
Il metodo NSString -initWithData:encoding:
restituisce nil
se fallisce, quindi puoi provare una codifica dopo l'altra fino a trovare quella che converte. Questo non garantisce che convertirai tutti i caratteri correttamente, ma se la tua fonte di feed non ti sta inviando un XML codificato correttamente, probabilmente dovrai convivere con esso.
L'idea di base è:
// 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...
}
Per essere generico e solido, puoi fare quanto segue fino a quando non ha successo:
1.) Prova la codifica specificata nell'intestazione Content-Type della risposta HTTP (se presente)
2.) Controlla l'inizio dei dati di risposta per un contrassegno ordine byte e se trovato, prova la codifica indicata
3.) Guarda i primi due byte; se trovi un carattere spazio bianco o '<' accoppiato con un carattere nul / zero, prova UTF-16 (allo stesso modo, puoi controllare i primi quattro byte per vedere se hai UTF-32)
4.) Scansiona l'inizio dei dati cercando le <?xml ... ?>
istruzioni di elaborazione e cerca encoding='something'
al suo interno; prova quella codifica.
5.) Prova alcune codifiche comuni. Controlla sicuramente Windows Latin-1, Mac Roman e ISO Latin-1 se l'origine dati è in inglese.
6.) Se nessuna delle precedenti funzioni funziona, puoi provare a rimuovere tutti i byte maggiori di 127 (o sostituire '?' o un altro carattere ASCII) e convertire i dati usando la codifica ASCII.
Se non hai un NSString a questo punto, dovresti fallire. Se hai una NSString, dovresti cercare la encoding
dichiarazione nelle CFStringConvertIANACharSetNameToEncoding()
istruzioni di elaborazione (se non l'hai già fatto al punto 4). Se è lì, dovresti riconvertire NSString in NSData usando quella codifica; se non è presente, è necessario riconvertirlo utilizzando la codifica UTF-8.
Inoltre, le funzioni CFStringConvertEncodingToNSStringEncoding()
e Content-Type
possono aiutare a ottenere la NSStringEncoding che accompagna il nome della codifica dall'intestazione <=> o l'istruzione di elaborazione <=>.
Puoi anche rimuovere quella riga di codifica da xml in questo modo:
int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\""
withString:@""
options:NSRegularExpressionSearch
range:NSMakeRange(0, length)];