2010-01-29 4 views
10

Welche NSString-Encoding-Methode wird das Ampersand () Zeichen korrekt in entkommen?NSString-Methode zu Prozent Escape '&' für URL

bekommt die Leerzeichen (% 20) und andere Bösewichte aber ignoriert kaufmännische Und-Zeichen!?!

+0

Ampersand ist ein gültiges Zeichen in URLs verarbeiten. "www.example.com? a = 5 & b = 7' –

+1

ich weiß..aber es ist meine Abfrage Parameter zu verwirren, so müssen Vorkommen von & in Werten" vor dem Hinzufügen zu Abfrage String entfernen. – Meltemi

Antwort

43

Ampersands werden von dieser Methode nicht verarbeitet, da es sich um gültige Zeichen in einer URL handelt. Sie sollten vor diesem Aufruf wahrscheinlich besonders problematische Stücke Stück für Stück vorverarbeiten.

+66

+1 für alliteration. –

23

Hier ist eine schöne Lösung für dieses von Bagonca blog genommen Problem Ihr NSStrings URL-Codierung:

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

hinzufügen CFBridgingRelease( für ARC-Kompatibilität.

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

Das hat mein Problem gelöst. Die Antwort war schwer zu finden, weil ich nicht wusste, dass die Ursache Charaktere in meinem POST-Körper waren. Es schien, als ob es wegen der Größe meiner Datei war. Wenn Sie eine sendAsynchronousRequest senden und die Anforderung die Nutzlast beendet, überprüfen Sie die Codierung. Vielen Dank. – dwaz

8

Die akzeptierte Antwort nicht ganz richtig ist, ich glaube nicht, müssen Sie die Zeichenfolge nach Aufruf addPercentEscapesAndReplaceAmpersand

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

Ja, aber das würde die Alliteration zerstören! – lol

+2

Das ist auch nicht richtig, wenn Sie eine Abfragezeichenfolge wie? Foo = bar & bar = foo erstellen und dann alle & s durch% 26 ersetzen. Es ist keine gültige Abfragezeichenfolge mehr. –

+4

Sie möchten die Bar- und Foo-Werte und nicht die gesamte Abfragezeichenfolge verarbeiten. – s1mm0t