2017-04-13 1 views
0

Ich versuche, eine URL zu erstellen und sicherzustellen, dass alle Sonderzeichen im Pfad codiert werden, ich bin derzeit fehlgeschlagen, möglicherweise aufgrund von Missverständnissen, wie die path Eigenschaft von NSURLComponents funktioniert.URLPathAllowedCharacterSet Codierung nicht Ausrufezeichen

NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; 

NSURLQueryItem *queryItem = [NSURLQueryItem queryItemWithName: @"queryName" value: @"queryValue"]; 
components.queryItems = @[queryItem]; 

// Ich dachte, dass stringByAddingPercentEncodingWithAllowedCharacters Zeichen wie kodieren würde "!" in "% 21"

components.path = [components.path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLPathAllowedCharacterSet]]; 

// eine URL mit Returns "!", uncodiert

[items addObject:components.URL]; 

Bin ich etwas grundlegend falsch in components.path tun?

Vielen Dank für Ihre Hilfe im Voraus.

Antwort

1

Seit URLPathAllowedCharacterSet enthält „!“, Würden Sie einen erstellen müssen neuer Zeichensatz durch Erstellen einer veränderbaren Kopie des URLPathAllowedCharacterSet und Entfernen des "!":

NSMutableCharacterSet *characterSet = [[NSCharacterSet URLPathAllowedCharacterSet] mutableCopy]; 
[characterSet removeCharactersInString:@"!"]; 
1

URLPathAllowedCharacterSet enthält „!“, So wird es nicht

codiert werden Sie können diesen Satz aufzuzählen mit dieser Routine

NSCharacterSet *set = [NSCharacterSet URLPathAllowedCharacterSet]; 

    for (int plane = 0; plane <= 16; plane++) { 
     if ([set hasMemberInPlane:plane]) { 
      UTF32Char c; 
      for (c = plane << 16; c < (plane+1) << 16; c++) { 
       if ([set longCharacterIsMember:c]) { 
        UTF32Char c1 = OSSwapHostToLittleInt32(c); // To make it byte-order safe 
        NSString *s = [[NSString alloc] initWithBytes:&c1 length:4 encoding:NSUTF32LittleEndianStringEncoding]; 
        NSLog(@"%@", s); 
       } 
      } 
     } 
    }