2010-11-29 5 views
2

Ich schreibe eine App, um mit einem DirecTV-Empfänger über die HTTP-Serverschnittstelle zu interagieren. Ich bin in der Lage, das Gerät abzufragen und die SJON-formatierte Antwort zu erhalten.Konvertierung von NSMutableData in NSString schlägt fehl, wenn Sonderzeichen vorhanden ist

Hier ist mein Beispielcode ist:

- (NSDictionary *) readDVRData 
{ 
    NSMutableData *rData = [[NSMutableData alloc] initWithContentsOfFile:@"./data"]; 
    //NSLog(@"rData = %@",rData); 
    NSString *rString = [[NSString alloc] initWithData:rData encoding:NSUTF8StringEncoding]; 
    NSLog(@"rString = %@",rString); 
    NSError *error; 
    SBJSON *json = [[SBJSON new] autorelease]; 
    NSDictionary *response = [json objectWithString:rString error:&error]; 
    //NSLog(@"response = %@",response); 
    return response;  
} 

Zu Testzwecken gespeichert ich die Antwort auf die Datendatei, und ich bin von ihm in dem obigen Beispiel zu lesen. Die Konvertierung von NSMutableData in NSString erfolgt über:

NSString *rString = [[NSString alloc] initWithData:rData encoding:NSUTF8StringEncoding]; 

schlägt fehl, wenn das folgende Zeichen vorhanden ist. È wie in Crème Fraiche. Als Referenz wurde dies in der Episode Title und Beschreibung aus einer South Park-Aufnahme.

Wenn ich dieses Zeichen in ein Großbuchstabe "E" ändere, funktioniert die Umwandlung. Gibt es eine andere Methode, die ich verwenden sollte, um so etwas zu fangen? Oder gibt es eine einfache Möglichkeit, solche Zeichen zu entfernen? Bitte beachten Sie, dass ich vorher nicht weiß, ob es ein Akzentzeichen oder etwas anderes ist, das die Konvertierung fehlschlagen lässt.

Danke, Dave

Snippet Datendatei, wenn diese benötigt wird. Ich würde den gesamten Text einschließen, aber es schiebt die Zeichengrenze über das Limit von 30000 hinaus.

{ 
     "groupId": "1 1 381C3", 
     "groupTitle": "South Park", 
     "isRecording": false, 
     "numItems": 10, 
     "numNewItems": 10, 
     "programs": [ 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 198", 
      "description": "\"CrÈme Fraiche\" Animation, Comedy. (2010) Trey Parker, Matt Stone. Randy's obsession with the Food Network forces Sharon to explore a new interest of her own. Series.", 
      "duration": 1800, 
      "episodeTitle": "CrÈme Fraiche", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6937756", 
      "rating": "TV-MA-L", 
      "startTime": 1290056400, 
      "title": "South Park", 
      "uniqueId": "5397375192530140068" 
     }, 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 197", 
      "description": "\"Coon vs. Coon & Friends\" Animation, Comedy. (2010) Trey Parker, Matt Stone. Coon and Friends find themselves at the mercy of Cartman who now has the dark lord doing his bidding; Kenny wrestles with the curse of his super power. Series.", 
      "duration": 1800, 
      "episodeTitle": "Coon vs. Coon & Friends", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6918387", 
      "rating": "TV-MA-L", 
      "startTime": 1289444400, 
      "title": "South Park", 
      "uniqueId": "8476957599452610419" 
     }, 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 196", 
      "description": "\"Mysterion Rises\" Animation, Comedy. (2010) Trey Parker, Matt Stone. Mysterion's true identity is revealed; scorned by fellow superheroes, one goes out for revenge. Series.", 
      "duration": 1800, 
      "episodeTitle": "Mysterion Rises", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6896823", 
      "rating": "TV-MA-L", 
      "startTime": 1288843200, 
      "title": "South Park", 
      "uniqueId": "2113731123121326471" 
     }, 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 0", 
      "description": "Animation, Comedy. Trey Parker, Matt Stone. The adventures of four boys who live in South Park, Colo. Series.", 
      "duration": 1800, 
      "episodeTitle": "", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6830127", 
      "rating": "TV-MA-L", 
      "startTime": 1288751400, 
      "title": "South Park", 
      "uniqueId": "2166056034991125062" 
     }, 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 195", 
      "description": "\"Coon 2: Hindsight\" Animation, Comedy. (2010) Trey Parker, Matt Stone. Coon and friends set out to help the victims of BP's latest catastrophic drilling accident in the Gulf. Series.", 
      "duration": 1800, 
      "episodeTitle": "Coon 2: Hindsight", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6876407", 
      "rating": "TV-MA-L", 
      "startTime": 1288238400, 
      "title": "South Park", 
      "uniqueId": "8615834721021879366" 
     }, 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 194", 
      "description": "\"Insheeption\" Animation, Comedy. (2010) Trey Parker, Matt Stone. When Stan is sent to the school counselor because he's holding on to an obscene number of useless possessions, he realizes that Mr. Mackey had a hoarding disorder too. Series.", 
      "duration": 1783, 
      "episodeTitle": "Insheeption", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6857628", 
      "rating": "TV-MA-L", 
      "startTime": 1287626416, 
      "title": "South Park", 
      "uniqueId": "1547798106243799673" 
     }, 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 193", 
      "description": "\"It's a Jersey Thing\" Animation, Comedy. (2010) Trey Parker, Matt Stone. New Jersey is taking over the nation one state at a time, Randy and the boys take a stand as the Jerseyites approach South Park. Series.", 
      "duration": 1800, 
      "episodeTitle": "It's a Jersey Thing", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6839243", 
      "rating": "TV-MA-L", 
      "startTime": 1287028800, 
      "title": "South Park", 
      "uniqueId": "8123622337314668826" 
     }, 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 193", 
      "description": "\"It's a Jersey Thing\" Animation, Comedy. (2010) Trey Parker, Matt Stone. New Jersey is taking over the nation one state at a time, Randy and the boys take a stand as the Jerseyites approach South Park. Series.", 
      "duration": 1784, 
      "episodeTitle": "It's a Jersey Thing", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6839243", 
      "rating": "TV-MA-L", 
      "startTime": 1287021615, 
      "title": "South Park", 
      "uniqueId": "949183344652655207" 
     }, 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 0", 
      "description": "Animation, Comedy. Trey Parker, Matt Stone. The adventures of four boys who live in South Park, Colo. Series.", 
      "duration": 1800, 
      "episodeTitle": "", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6830127", 
      "rating": "TV-MA-L", 
      "startTime": 1286937000, 
      "title": "South Park", 
      "uniqueId": "7841891672059226043" 
     }, 
     { 
      "callsign": "COMHD", 
      "contentId": "1 1 381C3 0", 
      "description": "Animation, Comedy. Trey Parker, Matt Stone. The adventures of four boys who live in South Park, Colo. Series.", 
      "duration": 1800, 
      "episodeTitle": "", 
      "expiration": "0", 
      "isHd": true, 
      "isPartial": false, 
      "isPpv": false, 
      "isRecording": false, 
      "isViewed": false, 
      "isVod": false, 
      "keepUntilFull": true, 
      "major": 249, 
      "minor": 65535, 
      "programId": "6830127", 
      "rating": "TV-MA-L", 
      "startTime": 1286856000, 
      "title": "South Park", 
      "uniqueId": "3872435936942587460" 
     } 
     ] 
    } 

Antwort

2

Haben Sie andere Kodierungen ausprobiert, wie NSISOLatin1StringEncoding?

+0

Dies funktionierte. Vielen Dank. – Dave

+0

@Dave, wenn es funktioniert, sollten Sie es als die richtige Antwort akzeptieren. – benzado

+0

@benzado, sorry wusste nicht, wie das geht. Hoffentlich klickt das Häkchen als richtige Antwort an. – Dave

1

Es ist wahrscheinlich ein Codierungsproblem vom Webserver. Sie erwarten UTF-8-Daten, aber ich wette, das ist nicht das, was sie Ihnen schicken. Versuchen Sie stattdessen, [NSString stringWithContentsOfFile:] zu lesen und sehen Sie, ob sich etwas ändert.

Der Compiler wird eine Warnung ausgeben, da diese Methode veraltet ist. In der Tat könnten Sie stringWithContentsOfFile verwenden: usedEncoding: error: stattdessen, aber ich und andere haben berichtet, dass es nicht so gut wie die alte Methode für Daten funktioniert, die nicht perfekt codiert ist (das heißt, 90% des Webs :-)).

+0

Mit NSISOLatin1StringEncoding wurde es behoben. Dank – Dave

0

Überprüfen Sie die HTTP-Header in der DirecTV-Einheit Antwort. Es verwendet wahrscheinlich nicht UTF-8. Finden Sie heraus, welche Kodierung verwendet wird, und geben Sie dann die korrekte Konstante an initWithData:encoding:.

Sie können den Befehl curl -i http://directv-data-url verwenden, um die HTTP-Header anzuzeigen.

+0

curl -i http://192.168.1.154:8080/dvr/getPlayList HTTP/1.0 200 OK Content-Type: application/json Datum: Di, 30. November 2010 03.10.21 GMT – Dave

+0

Oh well, es sollte die korrekte Textkodierung genannt haben, aber ich denke, es ist nicht erforderlich. – benzado