Frage

NSXMLParserInvalidCharacterError # 9

Das ist der Fehler, den ich bekomme, wenn ich einen seltsamen Charakter schlagen (wie Zitate aus Wort in dem Web-Formular kopiert und eingefügt, die im Futter am Ende). Das Futter ich verwende gibt nicht eine Codierung, und sie keine Hoffnung für mich, sie das ändern zu bekommen. Das ist alles, was ich in der Kopfzeile erhalten:

Was kann ich über illegale Zeichen tun, wenn Feeds Parsen? Muss ich die Daten an den Parse vor fegen? Gibt es etwas, das ich in der API bin fehlt? Hat jemand mit diesem Thema umgegangen?

War es hilfreich?

Lösung

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

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

Fixed meine Probleme ...

Andere Tipps

Die NSString -initWithData:encoding: Methode gibt nil wenn es fehlschlägt, so dass Sie eine Codierung nach dem anderen versuchen, bis Sie einen finden, umwandelt. Dies garantiert nicht, dass Sie richtig alle Zeichen konvertiert werden, aber wenn Ihr Feed-Quelle wird nicht Sie richtig codierte XML senden, dann werden Sie wahrscheinlich damit zu leben haben.

Die Grundidee ist:

// 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...
}

generic und robust sein, können Sie den folgenden bis zum Erfolg tun:

1.) Versuchen Sie, die Codierung in den Content-Type-Header der HTTP-Antwort angegeben ist (falls vorhanden)

2.) Überprüfen Sie den Beginn der Antwortdaten für einen Bytereihenfolgemarkierung rel="nofollow und wenn gefunden, versuchen Sie die angegebene Codierung

.

3) Schauen Sie sich die ersten beiden Bytes; wenn Sie ein Leerzeichen oder ‚<‘ gepaart mit einem nul / null Charakter finden, versucht UTF-16 (in ähnlicher Weise können Sie die ersten vier Bytes überprüfen, um zu sehen, wenn Sie UTF-32 haben)

.

4) Scannen Sie den Beginn der Daten für die <?xml ... ?> Verarbeitungsanweisung suchen und suchen nach encoding='something' hinein; versuchen, diese Codierung.

5.) Versuchen Sie einige gemeinsame Kodierungen. Auf jeden Fall überprüft Windows Latin-1, Mac Roman und ISO Latin-1, wenn Ihre Datenquelle ist in englischer Sprache.

6). Wenn keine der oben genannten Arbeit, Sie könnten versuchen, die Beseitigung alle Bytes von mehr als 127 (oder Ersatz ‚?‘ Oder ein anderes ASCII-Zeichen) und wandeln die Daten, die die ASCII-Codierung.

Wenn Sie von diesem Punkt kein NSString haben, sollen Sie scheitern. Wenn Sie ein NSString zu tun haben, sollten Sie die encoding Deklaration in der <?xml ... ?> Verarbeitungsanweisung suchen (wenn Sie in Schritt 4 nicht bereits getan haben). Wenn es sie gibt, sollten Sie die NSString zurück zu NSData Verwendung dieser Codierung konvertieren; wenn er nicht da ist, dann sollten Sie konvertieren zurück mit UTF-8-Codierung.

Auch können die CFStringConvertIANACharSetNameToEncoding() und CFStringConvertEncodingToNSStringEncoding() Funktionen helfen, den NSStringEncoding zu erhalten, die die Content-Type Header bilden oder die <?xml ... ?> Verarbeitungsanweisung mit der Codierung Namen geht.

Sie können auch diese Codierung Linie aus XML wie folgt entfernen:

int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
                        withString:@""
                        options:NSRegularExpressionSearch 
                        range:NSMakeRange(0, length)];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top