2010-10-05 5 views
0

J'ai donc ce morceau de code:Re codant pour une NSString renvoie null

if ([receivedPage hasPrefix:[NSString stringWithUTF8String:"\xC3\xAF\xC2\xBB\xC2\xBF"]]) // UTF-8 BOM 'EF BB BF' as UTF-16 chars 
    { 
     //DebugLog(@"converting calls list to UTF8"); 
     receivedPage = [[[NSString alloc] initWithData:[receivedPage dataUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding] autorelease]; 
    } 

Cependant, parfois, quand le cas est vrai que le receivedPage devient nulle. pourquoi cela arriverait-il?

La page reçue est la valeur renvoyée de cette fonction:

NSURLResponse * response; 
    NSData * result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:error]; 

    if ([result length] > 0) 
     return [[[NSString alloc] initWithBytes: (const void*)[result bytes] length:[result length] encoding: encoding] autorelease]; 
    else 
    { 
     if (error && *error) 
      DebugLog(@"URL request got error: %@",*error); 
     return nil; 
    } 

L'encodage est ici NSISOLatin1StringEncoding (ne sais pas pourquoi, je suis quelqu'un débogage du code d'autre).

Une idée pourquoi cela se produirait?

Répondre

0

Il semble que vous essayez de traiter les chaînes (objets contenant des caractères) comme des données (objets contenant des octets). Conservez les données que vous avez reçues de la connexion et recherchez la nomenclature UTF-8 (la version à trois octets appropriée) dans celle-ci, puis utilisez NSUTF8StringEncoding ou NSISOLatin1StringEncoding en fonction de si vous le trouvez. Ou, utilisez simplement UTF-8 conditionnellement, si vous pouvez réparer le serveur pour faire cela aussi.

En outre, vous devez probablement basculer ce code pour utiliser le NSURLConnection de manière asynchrone. Si la connexion Internet de l'utilisateur est lente, vous suspendez votre application ici. Le faire de manière asynchrone vous permet de garder l'interface utilisateur en cours d'exécution, afficher la progression le cas échéant, et permettre à l'utilisateur d'annuler.