2009-04-01 6 views

Respuesta

-2

En una URL, el signo comercial 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 en StackOverflow: ASP.Net URLEncode Ampersand for use in Query String

+0

Esta es exactamente la respuesta correcta (en el enlace). –

+5

... excepto que es para el marco equivocado. No .NET en iPhone. Así –

4

Uso% 26 como escape de URL.

otro escapa:

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

Si hago la siguiente estoy en lo cierto [statusTextField.text stringByReplacingOccurrencesOfString: @ "y" withString: @ "% 26"] y en mi lado del servidor sustituyo% con 26 y y almacenar en el PP. –

31

-stringByAddingPercentEscapesUsingEncoding: no lleva a cabo la codificación completa de escape. Debe agregar manualmente las codificaciones usando -replaceOccurrencesOfString:withString:

Aquí hay una lista completa (reflejando 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 su URL.

+8

creo que el código apropiado sería más como NSMutableString * escapó = [NSMutableString stringWithString: [actionString ...]]; y NSMakeRange (0, [longitud de escape])] en vez de cadena completa. – kolinko

+0

hacer mi día .. GRACIAS –

+1

Esto es bastante costoso, CFURLCreateStringByAddingPercentEscapes() es mejor. –

36

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 arco conformar ayudante función en línea:

#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 
+2

Más corto y más aterrador :) – bentford

+0

Consulte la respuesta de Roger a continuación. Si bien esta solución es una buena respuesta general, no es una implementación completa de codificación URL a partir de la versión 2.2 de iOS. Si alguien tiene información adicional acerca de esto en las versiones posteriores de iOS, por favor coméntelo aquí. – memmons

+1

¿por qué mutableCopy it? – user102008

0

stringByAddingPercentEscapesUsingEncoding también no funciona correctamente con +.

Aquí es una solución más simple:

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