iphone - parametros - url google satellite
Iphone SDk: Emita con ampersand en la cadena URL (6)
En una URL, el signo & es una palabra clave protegida que significa la inclusión de una variable querystring. No puedes ponerlo como parte del valor en sí mismo. Tienes que cambiarlo a otra cosa.
Aquí hay un enlace a la misma pregunta formulada en StackOverflow: ASP.Net URLEncode Ampersand para su uso en Query String
¿Cómo pasamos una cadena Mr.X y Mr.Y en la URL?
Lo he intentado pero este tiene todos los caracteres, pero solo.
[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
Gracias por la ayuda.
O incluso más corto:
@implementation NSString (Escaping)
- (NSString*)stringWithPercentEscape {
return [(NSString *) CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)[[self mutableCopy] autorelease],
NULL,
CFSTR("=,!$&''()*+;@?/n/"<>#/t :/"),
kCFStringEncodingUTF8) autorelease];
}
@end
Y aquí está de nuevo como un ayudante de función en línea conformes con 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
Use% 26 como escape de url.
Otras escapadas:
$ %24
& %26
+ %2B
, %2C
/ %2F
: %3A
; %3B
= %3D
? %3F
@ %40
-stringByAddingPercentEscapesUsingEncoding:
no realiza una codificación de escape completa. Debe agregar manualmente las codificaciones usando -replaceOccurrencesOfString:withString:
Aquí hay una lista completa (que refleja la lista de Gamecat) como se sugirió originalmente en https://devforums.apple.com/message/15674#15674 . Como Nick señala, esto es caro, así que no incluya simplemente la lista completa sin considerar sus requisitos reales para escapar.
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];
Este código sin duda hace un hash de tu URL.
CFURLCreateStringByAddingPercentEscapes
está en desuso (desde iOS9), entonces ¿qué hay de simplemente modificar el URLQueryAllowedCharacterSet para eliminar los caracteres reservados, lo que les permite estar codificados en porcentaje de manera relativamente eficiente?
- (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];
}
stringByAddingPercentEscapesUsingEncoding
tampoco funciona correctamente con +
.
Aquí hay una solución más simple:
[[[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] stringByReplacingOccurrencesOfString:@"&" withString:@"%26"] stringByReplacingOccurrencesOfString:@"+" withString:@"%2b"];