2012-04-12 8 views
8

estoy usando este fragmento de código para codificar los caracteres de ser amigable con una solicitud POST:escape Cotizaciones en Objective-C

NSString *unescaped = [textField text]; 
    NSString *escapedString = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
                        NULL, 
                        (__bridge_retained CFStringRef)unescaped, 
                        NULL, 
                        (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
                        kCFStringEncodingUTF8); 

que funciona muy bien, pero no añade escape de las comillas: "

¿Cómo evito las comillas en IOS?

Respuesta

15

creo que no lo hice palabra correctamente a la pregunta.

Necesitaba tomar NSString ingresado por el usuario desde [textField text] y asegúrese de que si hay comillas en la cadena, se escapen correctamente para enviar a través de una instrucción POST.

Mi solución fue:

unescaped = [unescaped stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; 

Gracias

+1

¿por qué no usar el método de clase" escapedPatternForString: "de NSRegularExpression? – Manoj

0

trate de usar \ "en lugar de utilizar" directamente ...

caracteres especiales como barras de cotizaciones, y otros requieren \ para hacer que el personaje para eliminar su funcionalidad especial.

1

Las citas se pueden escapar con \".

Como en:

(CFStringRef)@"I'm an \"example\"" 
+0

Sé esto, quiero que sepas cómo hacer que un usuario ingrese '" 'y lo cambie a : '\" ' – Moe

3

En primer lugar, usted no desea utilizar __bridge_retained en su elenco a un CFStringRef. Simplemente use __bridge.

En segundo lugar, no tiene que escapar de las cotizaciones manualmente mediante el reemplazo de cadenas. Simplemente agregue el carácter de comillas al conjunto de caracteres que se va a citar al llamar al CFURLCreateStringByAddingPercentEscapes(). De este modo:.

NSString *unescaped = [textField text]; 
NSString *escapedString = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, 
                        (__bridge CFStringRef)unescaped, 
                        NULL, 
                        CFSTR("!*'();:@&=+$,/?%#[]\""), 
                        kCFStringEncodingUTF8)); 

(Además de añadir la cita al conjunto, me cambiaron a utilizar CFBridgingRelease() en lugar de un reparto __bridge_transfer porque me resulta más claro Satisface la sensación de que toda CF "Crear" funciones necesitan una correspondiente "Liberación". Además, cambié el uso de un elenco literal @"" a CFStringRef a solo un CFSTR("") literal.)