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?

È stato utile?

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)];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top