iOS:如何进行正确的URL编码?

Hem*_*ang 28 url-encoding ios

我无法打开URL,UIWebView因此我已经进行了搜索并发现我需要对URL进行编码,因此我尝试对其进行编码,但是我在URL编码方面遇到了问题:我的网址是http://somedomain.com/data/Témp%20Page%20-%20Open.html(它不是真正的网址).

我很担心%20,我试着用替换stringByReplacingOccuranceOfString:@"" withString:@"",它给我我想要像URL http://somedomain.com/data/Témp Page - Open.html但它不是开放的UIWebView,但令人惊讶它在打开SafariFireFox完善.即使我打开未编码的URL,它也会自动转换并打开我正在寻找的页面.

我已经谷歌进行URL编码了,它指出了我已经检查过的不同结果,但没有结果帮助我!我在不同的URL编码问题中尝试了不同的函数答案,但它只是更改了所有特殊字符并使我的URL像在一起,甚至在任何浏览器中http%3A%2F%2Fsomedomain.com%2Fdata%2FT...都无法打开UIWebView.

它提供了以下Error LogUIWebView delegate

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { }
Run Code Online (Sandbox Code Playgroud)

错误代码:101&描述:错误域= WebKitErrorDomain代码= 101"操作无法完成.(WebKitErrorDomain错误101.)"UserInfo = 0x6e4cf60 {}

小智 16

@Dhaval Vaishnani提供的答案只是部分正确.这种方法对待?,=&字符不进行编码,因为他们在一个URL有效.因此,要编码任意字符串以安全地用作URL的一部分,您不能使用此方法.相反,你必须回到使用CoreFoundation和CFURLRef:

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

不要忘记使用处理结果字符串的所有权CFRelease(safeString);.

此外,似乎尽管标题,OP正在寻找解码而不是编码 字符串.CFURLRef有另一个类似的函数调用用于:

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

再次,不要忘记适当的内存管理.


Mat*_*man 14

我做了一些测试,我认为问题不是真的与UIWebView但是NSURL因为"Témp"中的é没有正确编码而不接受URL.这将导致+[NSURLRequest requestWithURL:]-[NSURL URLWithString:]返回,nil因为字符串包含格式错误的URL.我猜你最后会使用一个不好的nil请求-[UIViewWeb loadRequest:].

例:

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

输出:

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
Run Code Online (Sandbox Code Playgroud)

如果你真的想借用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];
Run Code Online (Sandbox Code Playgroud)


小智 13

最直接的方法是使用:

NSString *encodedString = [rawString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

iDhaval很接近,但他反过来做(解码而不是编码).

Anand的方式可行,但你很可能不得不替换空格和换行符.请参阅此处的参考资料:http: //en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

希望有所帮助.


iDh*_*val 6

在iPhone中对URL进行编码非常简单.它如下

NSString* strURL = @"http://somedomain.com/data/Témp Page - Open.html";

NSURL* url = [NSURL URLWithString:[strURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
Run Code Online (Sandbox Code Playgroud)

这是对URL进行编码的完美方式,我正在使用它,它完全适合我.

希望它能帮到你!!!

  • 请注意,`+ [NSString stringByReplacingPercentEscapesUsingEncoding:]`的行为有点奇怪,请参阅此博客文章http://madebymany.com/blog/url-encoding-an-nsstring-on-ios (3认同)
  • @Dhaval Vaishnani另外,发送给你的消息不是**编码**一个非转义的URL字符串,而是**解码**一个已经百分比转义的URL字符串. (2认同)