2010-01-29 11 views
10

¿Qué método de codificación NSString escapará por ciento del ampersand (&) carácter correctamente en %26?Método NSString para porcentaje de escape '&' para URL

stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding 

obtiene los espacios (% 20) y otros malos, pero ignora los símbolos &!

+0

Ampersand es un carácter válido en las direcciones URL. 'www.example.com? a = 5 & b = 7' –

+1

lo sé ... pero está estropeando mis parámetros de consulta, así que necesito" eliminar "las apariciones de los valores de & in antes de agregarlos a la cadena de consulta .. – Meltemi

Respuesta

43

Ampersands no se procesarán con ese método porque son caracteres legales en una URL. Probablemente deba preprocesar piezas particularmente problemáticas, poco a poco, antes de esta llamada.

+66

+1 para aliteración. –

23

Aquí es una buena solución a este problema tomado de Bagonca blog a cifrar la URL de sus NSStrings:

+ (NSString *)urlEncodeValue:(NSString *)str 
{ 
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8); 
    return [result autorelease]; 
} 

Añadir CFBridgingRelease( para la compatibilidad ARC.

+ (NSString *)urlEncodeValue:(NSString *)str 
{ 
    NSString *result = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8)); 
    return result; 
} 
+0

Esto resolvió mi problema. La respuesta fue difícil de encontrar porque no sabía que la causa eran los personajes en mi cuerpo POST. Parecía que era debido al tamaño de mi archivo. Si está enviando sendAsynchronousRequest y la solicitud finaliza la carga útil, verifique la codificación. Gracias. – dwaz

8

La respuesta aceptada no está bien no creo, es necesario procesar la cadena después llamando addPercentEscapesAndReplaceAmpersand

+ (NSString *) addPercentEscapesAndReplaceAmpersand: (NSString *) stringToEncode 
{ 
    NSString *encodedString = [stringToEncode stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
    return [encodedString stringByReplacingOccurrencesOfString: @"&" withString: @"%26"]; 
} 
+4

¡Sí, pero eso arruinaría la aliteración! – lol

+2

Eso tampoco está bien si crea una cadena de consulta como? Foo = bar & bar = foo y luego reemplaza todas las & s con% 26, ya no es una cadena de consulta válida. –

+4

Desea procesar los valores de barra y foo en lugar de toda la cadena de consulta. – s1mm0t

Cuestiones relacionadas