NSMutableData à la conversion NSString échoue si elle est présente de caractère spécial

StackOverflow https://stackoverflow.com/questions/4307455

  •  29-09-2019
  •  | 
  •  

Question

J'écris une application pour interagir avec un récepteur DirecTV via l'interface du serveur http. Je suis capable d'interroger l'appareil et obtenir la réponse au format Sjon.

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 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. e comme Fraiche CRÈME . Pour référence ce fut dans la episodeTitle et la description d'un enregistrement South Park.

Si je change ce caractère juste une majuscule « E », les travaux de conversion. Y at-il une autre méthode que je devrais utiliser pour attraper quelque chose comme ça? Ou est-il un moyen simple de supprimer des caractères comme celui-ci? S'il vous plaît garder à l'esprit que je ne saurai pas avant la main si elle est et la marque d'accent ou quelque chose de différent qui pourrait provoquer la conversion à l'échec.

Merci, Dave

Snippet de fichier de données si cela est nécessaire. Je comprend tout le texte, mais il repousse la limite de caractères au-dessus du 30000 limite.

{
      "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"
        }
      ]
    }
Était-ce utile?

La solution

Avez-vous essayé d'autres encodages, comme NSISOLatin1StringEncoding?

Autres conseils

Il est probablement un problème d'encodage à partir du serveur Web. Vous vous attendez à des données UTF-8, mais je vous parie que ce n'est pas ce qu'ils vous envoient. Essayez de lire à l'aide [NSString stringWithContentsOfFile:] au lieu et voir si quelque chose change.

Le compilateur jeter un avertissement, car cette méthode est dépréciée. En fait, vous pouvez utiliser stringWithContentsOfFile: usedEncoding: erreur: au lieu, mais je et d'autres ont indiqué qu'il ne semble pas fonctionner aussi bien que l'ancienne méthode pour les données qui ne sont pas parfaitement encodées (soit 90% du web : -).)

Vérifiez les en-têtes HTTP dans la réponse de l'unité de DirecTV. Il est probablement pas en UTF-8. Figure quels codant pour qu'il utilise, puis fournir la constante correcte à initWithData:encoding:.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top