How do I URL encode a string

前端 未结 22 1684
轮回少年
轮回少年 2020-11-22 07:16

I have a URL string (NSString) with spaces and & characters. How do I url encode the entire string (including the & ampersand

相关标签:
22条回答
  • 2020-11-22 08:04

    After reading all the answers for this topic and the (wrong) accepted one, I want to add my contribution.

    IF the target is iOS7+, and in 2017 it should since XCode makes really hard to deliver compatibility under iOS8, the best way, thread safe, fast, amd will full UTF-8 support to do this is:

    (Objective C code)

    @implementation NSString (NSString_urlencoding)
    
    - (NSString *)urlencode {
        static NSMutableCharacterSet *chars = nil;
        static dispatch_once_t pred;
    
        if (chars)
            return [self stringByAddingPercentEncodingWithAllowedCharacters:chars];
    
        // to be thread safe
        dispatch_once(&pred, ^{
            chars = NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;
            [chars removeCharactersInString:@"!*'();:@&=+$,/?%#[]"];
        });
        return [self stringByAddingPercentEncodingWithAllowedCharacters:chars];
    }
    @end
    

    This will extend NSString, will exclude RFC forbidden characters, support UTF-8 characters, and let you use things like:

    NSString *myusername = "I'm[evil]&want(to)break!!!$->àéìòù";
    NSLog(@"Source: %@ -> Dest: %@", myusername, [myusername urlencode]);
    

    That will print on your debug console:

    Source: I'm[evil]&want(to)break!!!$->àéìòù -> Dest: I%27m%5Bevil%5D%26want%28to%29break%21%21%21%24-%3E%C3%A0%C3%A9%C3%AC%C3%B2%C3%B9

    ... note also the use of dispatch_once to avoid multiple initializations in multithread environments.

    0 讨论(0)
  • 2020-11-22 08:05

    I opted to use the CFURLCreateStringByAddingPercentEscapes call as given by accepted answer, however in newest version of XCode (and IOS), it resulted in an error, so used the following instead:

    NSString *apiKeyRaw = @"79b|7Qd.jW=])(fv|M&W0O|3CENnrbNh4}2E|-)J*BCjCMrWy%dSfGs#A6N38Fo~";
    
    NSString *apiKey = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)apiKeyRaw, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8));
    
    0 讨论(0)
  • 2020-11-22 08:05

    So many answers but didn't work for me, so I tried the following:

    fun simpleServiceCall(for serviceUrl: String, appendToUrl: String) { 
        let urlString: String = serviceUrl + appendToUrl.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!     
    
        let finalUrl = URL(string: urlString)!
    
        //continue to execute your service call... 
    }
    

    Hopefully it'll help someone. thanks

    0 讨论(0)
  • 2020-11-22 08:08

    For individual www form-encoded query parameters, I made a category on NSString:

    - (NSString*)WWWFormEncoded{
         NSMutableCharacterSet *chars = NSCharacterSet.alphanumericCharacterSet.mutableCopy;
         [chars addCharactersInString:@" "];
         NSString* encodedString = [self stringByAddingPercentEncodingWithAllowedCharacters:chars];
         encodedString = [encodedString stringByReplacingOccurrencesOfString:@" " withString:@"+"];
         return encodedString;
    }
    
    0 讨论(0)
  • 2020-11-22 08:08

    This one is working for me.

    func stringByAddingPercentEncodingForFormData(plusForSpace: Bool=false) -> String? {
        let unreserved = "*-._"
        let allowed = NSMutableCharacterSet.alphanumericCharacterSet()
        allowed.addCharactersInString(unreserved)
    
        if plusForSpace {
            allowed.addCharactersInString(" ")
        }
    
        var encoded = stringByAddingPercentEncodingWithAllowedCharacters(allowed)
        if plusForSpace {
            encoded = encoded?.stringByReplacingOccurrencesOfString(" ",
                                                                    withString: "+")
        }
        return encoded
    }
    

    I found the above function from this link: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/

    You can also use this function with swift extension. Please let me know if there is any issue.

    0 讨论(0)
  • 2020-11-22 08:10

    In swift 3:

    // exclude alpha and numeric == "full" encoding
    stringUrl = stringUrl.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!;
    
    // exclude hostname and symbols &,/ and etc
    stringUrl = stringUrl.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!;
    
    0 讨论(0)
提交回复
热议问题