Search code examples
iosurl-encoding

iOS : How to do proper URL encoding?


I'm unable to open a URL into UIWebView so I've seached & found that I need to encode URL, so I tried to encode it but, I've facing problem in URL encoding : My URL is http://somedomain.com/data/Témp%20Page%20-%20Open.html (It's not real URL).

I'm concerned with %20 that I tried to replace using stringByReplacingOccuranceOfString:@"" withString:@"" , it give me the URL I wanted like http://somedomain.com/data/Témp Page - Open.html However its not opening in UIWebView but amazingly it opens in Safari & FireFox perfect. Even I open unencoded URL its automatically converts and open the page I'm looking for.

I've google for URL encoding & it points me to different results I already checked but no results help me out!! I tried different functions answers in different URL encoding question but it just changed all special characters and make my URL like, http%3A%2F%2Fsomedomain.com%2Fdata%2FT... which can't open in UIWebView and even in any browser.

It gives the following Error Log in UIWebView delegate

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { }

Error Code : 101 & Description : Error Domain=WebKitErrorDomain Code=101 "The operation couldn’t be completed. (WebKitErrorDomain error 101.)" UserInfo=0x6e4cf60 {}


Solution

  • I did some tests and I think the problem is not really with the UIWebView but instead that NSURL won't accept the URL because of the é in "Témp" is not encoded properly. This will cause +[NSURLRequest requestWithURL:] and -[NSURL URLWithString:] to return nil as the string contains a malformed URL. I guess that you then end up using a nil request with -[UIViewWeb loadRequest:] which is no good.

    Example:

    NSLog(@"URL with é: %@", [NSURL URLWithString:@"http://host/Témp"]);
    NSLog(@"URL with encoded é: %@", [NSURL URLWithString:@"http://host/T%C3%A9mp"]);
    

    Output:

    2012-10-02 12:02:56.366 test[73164:c07] URL with é: (null)
    2012-10-02 12:02:56.368 test[73164:c07] URL with encoded é: http://host/T%C3%A9mp
    

    If you really really want to borrow the graceful handling of malformed URLs that WebKit has and don't want to implement it yourself you can do something like this but it is very ugly:

    UIWebView *webView = [[[UIWebView alloc]
                           initWithFrame:self.view.frame]
                          autorelease];
    
    NSString *url = @"http://www.httpdump.com/texis/browserinfo/Témp.html";
    
    [webView loadHTMLString:[NSString stringWithFormat:
                             @"<script>window.location=%@;</script>",
                             [[[NSString alloc]
                               initWithData:[NSJSONSerialization
                                             dataWithJSONObject:url
                                             options:NSJSONReadingAllowFragments
                                             error:NULL]
                               encoding:NSUTF8StringEncoding]
                              autorelease]]
                    baseURL:nil];