iOS:如何做适当的URL编码?

我无法打开一个URL到UIWebView所以我已经find了,我发现我需要编码的URL,所以我试图编码,但是,我面临着URL编码的问题:我的url是http://somedomain.com/data/Témp%20Page%20-%20Open.html (这不是真正的URL)。

我很关心%20 ,我试图用stringByReplacingOccuranceOfString:@"" withString:@""replacestringByReplacingOccuranceOfString:@"" withString:@"" ,它给了我想要的URL,像http://somedomain.com/data/Témp Page - Open.html然而,它的不在UIWebView开放,但令人惊讶的是它在SafariFireFox完美打开。 即使我打开未编码的url,它会自动转换并打开我正在寻找的网页。

我谷歌的URL编码&它指向我不同的结果,我已经检查,但没有结果帮助我了! 我试过不同的function在不同的URL编码问题的答案,但它只是改变了所有的特殊字符,使我的url,如http%3A%2F%2Fsomedomain.com%2Fdata%2FT...无法在UIWebView打开,甚至在任何浏览器。

它在UIWebView delegate提供以下Error Log

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

错误代码:101&说明:错误域= WebKitErrorDomain代码= 101“操作无法完成(WebKitErrorDomain错误101.)”UserInfo = 0x6e4cf60 {}

我做了一些testing,我认为这个问题不是真的与UIWebView ,而是NSURL不会接受这个URL,因为“Témp”中的é没有被正确编码。 这将导致+[NSURLRequest requestWithURL:]-[NSURL URLWithString:]返回nil因为该string包含格式不正确的URL。 我想你最终使用-[UIViewWeb loadRequest:]请求-[UIViewWeb loadRequest:]这是不好的。

例:

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

输出:

 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 

如果你真的想借用WebKit已经不想实现的格式不正确的URL的优雅处理,你可以做这样的事情,但是这很丑陋:

 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]; 

@Dhaval Vaishnani提供的答案只是部分正确的。 这种方法对待?=&字符不被编码,因为它们在URL中是有效的。 因此,要将任意string编码为安全地用作URL的一部分,则不能使用此方法。 相反,你必须回头使用CoreFoundation和CFURLRef

 NSString *unsafeString = @"this &string= confuses ? the InTeRwEbZ"; CFStringRef safeString = CFURLCreateStringByAddingPercentEscapes ( NULL, (CFStringRef)unsafeString, NULL, CFSTR("/%&=?$#+-~@<>|\\*,.()[]{}^!"), kCFStringEncodingUTF8 ); 

不要忘记使用CFRelease(safeString);处理结果string的所有权CFRelease(safeString);

另外,似乎尽pipe标题,OP正在寻找解码,而不是编码一个string。 CFURLRef还有另外一个类似的函数调用:

 NSString *escapedString = @"%32%65BCDEFGH"; CFStringRef unescapedString = CFURLCreateStringByReplacingPercentEscapesUsingEncoding ( NULL, (CFStringRef)escapedString, CFSTR(""), kCFStringEncodingUTF8 ); 

同样,不要忘记正确的内存pipe理。

最直接的方法是使用:

 NSString *encodedString = [rawString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

iDhaval非常接近,但他却是这样做的(解码而不是编码)。

阿南德的方式将工作,但你很可能需要更换更多的字符比空格和新行。 请参阅参考: http :

希望有所帮助。

在iPhone中编码URL非常简单。 如下所示

 NSString* strURL = @"http://somedomain.com/data/Témp Page - Open.html"; NSURL* url = [NSURL URLWithString:[strURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

这是一个完美的方式来编码的url,我使用它,这完全符合我的工作。

希望它会帮助你!

这对于那些对这个问题进行url编码的人来说可能是有用的,因为我的问题可能不同于已经解决和接受的问题 ,这是我用来编码的方式,

 -(NSString *)encodeURL:(NSString *)urlString { CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString, NULL, CFSTR("!*'();:@&=+@,/?#[]"), kCFStringEncodingUTF8); return (NSString *)CFBridgingRelease(newString); } 

你可以试试这个

 NSString *url = @"http://www.abc.com/param=Hi how are you"; NSString* encodedUrl = [url stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding]; 

我认为这会为你工作

 [strUrl stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet] 

URL编码的本地方法。

您可能需要将URL分解为其组成部分,然后对主机和path进行URL编码,而不是该scheme。 然后再把它放回去。

用这个string创build一个NSURL,然后使用它的方法,例如主机,scheme,path,查询等将其拉开。 然后使用CFURLCreateStringByAddingPercentEscapes对部件进行编码,然后再将它们放回到一个新的NSURL中。

Swift 4.x

 let originalString = "https://www.somedomain.com/folder/some cool file.jpg" let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) print(escapedString!) 

你可以请尝试一下。

  //yourURL contains your Encoded URL yourURL = [yourURL stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; yourURL = [yourURL stringByReplacingOccurrencesOfString:@"\n" withString:@""]; NSLog(@"Keyword:%@ is this",yourURL); 

我不确定,但我已经解决了在我的情况下使用这个。 希望这会解决你的。