2010-11-29 15 views
2

J'écris une application pour interagir avec un récepteur DirecTV via l'interface du serveur http. Je suis en mesure d'interroger l'appareil et obtenir la réponse formatée SJON.La conversion de NSMutableData à NSString échoue si un caractère spécial est présent

Voici mon exemple de code:

- (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;  
} 

Pour des fins de test, j'ai sauvé la réponse au fichier de données et je lis dans l'exemple ci-dessus. La conversion de NSMutableData à NSString via:

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

échoue si le caractère suivant est en place. È comme dans CrÈme Fraiche. Pour référence, c'était dans l'épisode Titre et la description d'un enregistrement de South Park.

Si je remplace ce caractère par un "E" majuscule, la conversion fonctionne. Y a-t-il une méthode différente que je devrais utiliser pour attraper quelque chose comme ça? Ou y a-t-il un moyen simple de supprimer des caractères comme celui-ci? S'il vous plaît gardez à l'esprit que je ne saurai pas à la main si c'est la marque et l'accent ou quelque chose de différent qui pourrait entraîner l'échec de la conversion.

Merci, Dave

Snippet du fichier de données si cela est nécessaire. J'inclurais le texte entier, mais il pousse la limite de caractères au-dessus de la limite 30000.

{ 
     "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" 
     } 
     ] 
    } 

Répondre

2

Avez-vous essayé d'autres codages, tels que NSISOLatin1StringEncoding?

+0

Cela a fonctionné. Merci. – Dave

+0

@Dave, si cela a fonctionné, vous devriez l'accepter comme la bonne réponse. – benzado

+0

@benzado, désolé ne savait pas comment faire cela. Espérons que cliquer sur la coche l'accepte comme la bonne réponse – Dave

1

Il s'agit probablement d'un problème d'encodage du serveur Web. Vous attendez des données UTF-8, mais je vous parie que ce n'est pas ce qu'ils vous envoient. Essayez de lire en utilisant [NSString stringWithContentsOfFile:] à la place et voyez si quelque chose change.

Le compilateur lancera un avertissement car cette méthode est obsolète. En fait, vous pouvez utiliser stringWithContentsOfFile: usedEncoding: error: à la place, mais moi et d'autres ont signalé qu'il ne semble pas fonctionner aussi bien que l'ancienne méthode pour les données qui ne sont pas parfaitement codées (c'est-à-dire 90% du web :-)).

+0

L'utilisation de NSISOLatin1StringEncoding l'a corrigé. Merci – Dave

0

Vérifiez les en-têtes HTTP dans la réponse de l'unité DirecTV. Il n'utilise probablement pas UTF-8. Déterminez le codage utilisé, puis fournissez la constante correcte à initWithData:encoding:.

Vous pouvez utiliser la commande curl -i http://directv-data-url pour afficher les en-têtes HTTP.

+0

curl -i http://192.168.1.154:8080/dvr/getPlayList HTTP/1.0 200 OK Type de contenu: application/json Date: mar, 30 nov 2010 03:10:21 GMT – Dave

+0

Oh bien, il aurait dû nommer l'encodage de texte correct, mais je suppose que ce n'est pas obligatoire. – benzado