2012-04-12 10 views
8

ich diesen Code-Schnipsel bin mit Zeichen zu codieren, mit einer POST-Anfrage, freundlich zu sein:Flucht Zitate in Objective-C

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

die großen Werke, ist aber nicht entkommen Anführungszeichen hinzu: "

Wie entkomme ich Anführungszeichen in IOS?

Antwort

15

ich glaube, ich die Frage nicht richtig Wort tat.

Ich musste den Benutzer eingegeben NSString von [textField text] und stellen Sie sicher, dass, wenn Anführungszeichen in der Zeichenfolge sind, sie ordnungsgemäß maskiert werden, um über eine POST-Anweisung zu senden.

Meine Lösung war:

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

Dank

+1

Warum nicht NSRegularExpressions" escapedPatternForString: "Klassenmethode? – Manoj

0

versuchen \ „statt mit“ direkt mit ...

Sonderzeichen wie Zitate, Schrägstriche und andere erfordern \ diesen Charakter machen seine spezielle Funktionalität zu entfernen.

1

Quotes sind mit \" zu maskieren.

Wie in:

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

Ich weiß das, ich möchte, dass Sie wissen, wie Sie einen Benutzer eingeben "" und ändern Sie es : '\" ' – Moe

3

Zuerst wollen Sie nicht __bridge_retained in Ihrer Umwandlung in ein CFStringRef verwenden. Verwenden Sie einfach __bridge.

Zweitens müssen Sie die Anführungszeichen nicht manuell durch Zeichenfolge ersetzen. Fügen Sie einfach das Anführungszeichen zu der Zeichengruppe hinzu, die beim Aufruf von CFURLCreateStringByAddingPercentEscapes() zitiert werden soll. Wie so:.

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

(Zusätzlich zum Hinzufügen des Zitats auf den Satz, Ich änderte CFBridgingRelease() zu verwenden, anstatt eine __bridge_transfer Besetzung, weil ich es klarer finden Sie erfüllen das Gefühl, dass alle CF „Erstellen“ Funktionen ein brauchen Entsprechendes "Release". Außerdem habe ich die Verwendung einer @"" Literal - Umwandlung in CFStringRef in ein CFSTR("") Literal geändert.)