Iphone SDk: problema con la e commerciale nella stringa dell’URL

come passiamo una stringa Mr.X e Mr.Y nell’URL.

Ho provato questo, ma questo fa tutti i caratteri ma anche commerciale.

[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 

Grazie per l’aiuto.

O ancora più corto:

 @implementation NSString (Escaping) - (NSString*)stringWithPercentEscape { return [(NSString *) CFURLCreateStringByAddingPercentEscapes( NULL, (CFStringRef)[[self mutableCopy] autorelease], NULL, CFSTR("=,!$&'()*+;@?\n\"<>#\t :/"), kCFStringEncodingUTF8) autorelease]; } @end 

Ed eccolo di nuovo come un aiutante di funzione inline conforms all’ARC:

 #if __has_feature(objc_arc) static inline NSString *hxURLEscape(NSString *v) { static CFStringRef _hxURLEscapeChars = CFSTR("=,!$&'()*+;@?\r\n\"<>#\t :/"); return ((__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes( NULL, (__bridge CFStringRef)[v mutableCopy], NULL, _hxURLEscapeChars, kCFStringEncodingUTF8)); } #endif 

-stringByAddingPercentEscapesUsingEncoding: non esegue la codifica di escape completa. Dovresti aggiungere manualmente le codifiche usando -replaceOccurrencesOfString:withString:

Ecco una lista completa (che rispecchia l’elenco di Gamecat) come originariamente suggerito su https://devforums.apple.com/it/message/15674#15674 . Come sottolinea Nick, questo è costoso, quindi non includere semplicemente l’elenco completo senza considerare i tuoi reali requisiti per la fuga.

 NSMutableString *escaped = [actionString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [escaped replaceOccurrencesOfString:@"$" withString:@"%24" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"," withString:@"%2C" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@";" withString:@"%3B" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"=" withString:@"%3D" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"?" withString:@"%3F" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"@" withString:@"%40" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"\t" withString:@"%09" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"#" withString:@"%23" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"<" withString:@"%3C" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@">" withString:@"%3E" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"\"" withString:@"%22" options:NSCaseInsensitiveSearch range:wholeString]; [escaped replaceOccurrencesOfString:@"\n" withString:@"%0A" options:NSCaseInsensitiveSearch range:wholeString]; 

Questo codice rende sicuramente un hash del tuo URL.

Usa% 26 come escape dell’URL.

Altre fughe:

 $ %24 & %26 + %2B , %2C / %2F : %3A ; %3B = %3D ? %3F @ %40 

stringByAddingPercentEscapesUsingEncoding inoltre non funziona correttamente con + .

Ecco una soluzione più semplice:

 [[[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] stringByReplacingOccurrencesOfString:@"&" withString:@"%26"] stringByReplacingOccurrencesOfString:@"+" withString:@"%2b"]; 

CFURLCreateStringByAddingPercentEscapes è deprecato (dal momento che iOS9), quindi che ne dici di modificare semplicemente URLQueryAllowedCharacterSet per rimuovere i caratteri riservati, consentendo in tal modo di codificarli per cento in modo relativamente efficiente?

 - (NSString *)URLQueryValueEncodedString:(NSString *)string { static NSMutableCharacterSet *_allowedCharacterSet = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSString *reservedCharacters = @"=,!$&'()*+;@?\r\n\"<>#\t :/[]%"; _allowedCharacterSet = [NSCharacterSet URLQueryAllowedCharacterSet].mutableCopy; [_allowedCharacterSet removeCharactersInString:reservedCharacters]; }); return [string stringByAddingPercentEncodingWithAllowedCharacters:_allowedCharacterSet]; } 

In un URL, la e commerciale è una parola chiave protetta che indica l’inclusione di una variabile querystring. Non puoi inserirlo come parte del valore stesso. Devi cambiarlo in qualcos’altro.

Ecco un collegamento alla stessa domanda posta su StackOverflow: ASP.Net URLEncode E commerciale da utilizzare nella stringa di query