2010-06-23 12 views
1

Je dois des données POST sur une page php à partir d'une application iPhone, donc je dois coder les paramètres correctement, la conversion des caractères spéciaux ...chaîne de codage pour URL

Plus précisément, je besoin d'envoyer l'UDID du iphone.

J'ai trouvé beaucoup d'aide sur le web pour encoder la chaîne à passer en paramètre, mais j'ai eu une erreur étrange.

J'utilise cette fonction:

- (NSString *)URLEncodeString:(NSString *)string { 

NSString *result = 
    (NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
    (CFStringRef)string, NULL, CFSTR("'\"?=&+<>;:-"), kCFStringEncodingUTF8); 

return [result autorelease];} 

il semble correct, mais quand je l'utilise, le résultat est pas ce que je pense pour.

Voici le code:

UIDevice *device = [UIDevice currentDevice]; 
NSString *uniqueIdentifier = [device uniqueIdentifier]; 

NSLog(uniqueIdentifier); 
NSLog([self URLEncodeString:uniqueIdentifier]); 

et c'est le journal généré lorsque je tape ce code:

2010-06-23 21:58:51.671 provaNavigation[2343:20b] 00000000-0000-1000-8000-0013775CE6D2 
2010-06-23 21:58:51.672 provaNavigation[2343:20b] 0000000010003900009080176010001273086780001283520013775CE6D2 

et encore:

2010-06-23 21:59:25.614 provaNavigation[2343:20b] 00000000-0000-1000-8000-0013775CE6D2 
2010-06-23 21:59:25.615 provaNavigation[2343:20b] 000000001000390000908192801000-18000912258750013775CE6D2 

et encore:

2010-06-23 21:59:40.848 provaNavigation[2343:20b] 00000000-0000-1000-8000-0013775CE6D2 
2010-06-23 21:59:40.849 provaNavigation[2343:20b] 000000001000390000908866081000-18000912239630013775CE6D2 

et encore ...

Je reçois une valeur différente à chaque fois et ne corrige jamais avec le bon nombre de%.

+0

Est-ce que c'est dans l'appareil ou dans le simulateur? – Jasarien

Répondre

6

Je suis venu à travers des problèmes de codage URL avant, donc je fini par écrire une catégorie sur NSString pour encoder les URL:

- (NSString *) URLEncodedString { 
    NSMutableString * output = [NSMutableString string]; 
    const char * source = [self UTF8String]; 
    int sourceLen = strlen(source); 
    for (int i = 0; i < sourceLen; ++i) { 
    const unsigned char thisChar = (const unsigned char)source[i]; 
    if (thisChar == ' '){ 
     [output appendString:@"+"]; 
    } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || 
      (thisChar >= 'a' && thisChar <= 'z') || 
      (thisChar >= 'A' && thisChar <= 'Z') || 
      (thisChar >= '0' && thisChar <= '9')) { 
     [output appendFormat:@"%c", thisChar]; 
    } else { 
     [output appendFormat:@"%%%02X", thisChar]; 
    } 
    } 
    return output; 
} 

- (NSString *) URLDecodedString { 
    NSString * spacedDecoded = [self stringByReplacingOccurrencesOfString:@"+" withString:@" "]; 
    return [spacedDecoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
} 

Il y a quelques notes à ce sujet:

  1. Cette codera les espaces comme "+"
  2. Ceci encode tout sauf az (majuscule et minuscule), nombres, point, trait d'union, trait de soulignement, et tilde
  3. Ceci encodera correctement les caractères Unicode en plusieurs octets. Par exemple, je peux faire:

    NSString * enc = [@"http://example.com/?data=÷¡¿" URLEncodedString]; 
    NSLog(@"%@", enc); 
    NSLog(@"%@", [enc URLDecodedString]);

    qui va bien vous connecter:

    Testing.m:65 main() http%3A%2F%2Fexample.com%2F%3Fdata%3D%C3%B7%C2%A1%C2%BF 
    Testing.m:66 main() http://example.com/?data=÷¡¿

EDIT Je copié et collé dans un projet vide, comme ceci:

NSString * string = @"00000000-0000-1000-8000-0013775CE6D2"; 
NSString *result = (NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR("'\"?=&+<>;:-"), kCFStringEncodingUTF8); 
NSLog(@"encode? %@", result); 
result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"decode? %@", result); 
NSLog(@"equal? %d", [string isEqual:result]); 

Et il enregistre:

Testing[62541:a0f] encode? 00000000%2D0000%2D1000%2D8000%2D0013775CE6D2 
Testing[62541:a0f] decode? 00000000-0000-1000-8000-0013775CE6D2 
Testing[62541:a0f] equal? 1 

La raison pour laquelle votre code ne fonctionne pas est parce que vous vous connectez la chaîne comme la chaîne de format, ce qui signifie qu'il est de voir les choses %2 et d'essayer de le remplacer par d'autres choses.Observer:

NSString * string = @"00000000-0000-1000-8000-0013775CE6D2"; 
NSString *result = (NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR("'\"?=&+<>;:-"), kCFStringEncodingUTF8); 
NSLog(@"%@", result); 
NSLog(result); 

Journaux:

Testing[62585:a0f] 00000000%2D0000%2D1000%2D8000%2D0013775CE6D2 
Testing[62585:a0f] 00000000879923200001897296640100041968968000 00013775CE6D2 

Ainsi, la chaîne est correctement obtenir codé, mais vous vous connectez simplement mal.

+0

Merci pour votre réponse. Mais je voudrais savoir pourquoi le code que j'ai utilisé ne fonctionne pas correctement ... Sur le web beaucoup de gens prétendent que ce code fonctionne! – iphonePom

+0

@iphonePom a édité la réponse. –

+0

Merde, je savais que c'était quelque chose de stupide. Merci beaucoup l'homme! – iphonePom