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
开放,但令人惊讶的是它在Safari
和FireFox
完美打开。 即使我打开未编码的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);
我不确定,但我已经解决了在我的情况下使用这个。 希望这会解决你的。