28

我无法打开一个 URL,UIWebView所以我搜索并发现我需要对 URL 进行编码,所以我尝试对其进行编码,但是我在 URL 编码中遇到了问题:我的 URL 是http://somedomain.com/data/Témp%20Page%20-%20Open.html(它不是真正的 URL)。

我担心%20我试图替换 using stringByReplacingOccuranceOfString:@"" withString:@"",它给了我想要的 URLhttp://somedomain.com/data/Témp Page - Open.html但是它没有打开,UIWebView但令人惊讶的是它打开SafariFireFox完美。即使我打开未编码的 URL,它也会自动转换并打开我正在寻找的页面。

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

它给出了以下Error Log内容UIWebView delegate

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

错误代码:101 & 描述:错误域 = WebKitErrorDomain 代码 = 101“操作无法完成。(WebKitErrorDomain 错误 101。)”用户信息 = 0x6e4cf60 {}

4

10 回答 10

16

@Dhaval Vaishnani 提供的答案只是部分正确。此方法将?,=&字符视为未编码,因为它们在 URL 中有效。因此,要将任意字符串编码为安全地用作 URL 的一部分,您不能使用此方法。相反,您必须回退到使用 CoreFoundation 和CFURLRef

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

不要忘记使用CFRelease(safeString);.

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

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

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

于 2012-10-02T06:32:54.063 回答
15

我做了一些测试,我认为问题不是真正的问题,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"]);

输出:

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];
于 2012-10-02T10:03:49.277 回答
13

最直接的方法是使用:

NSString *encodedString = [rawString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

iDhaval 很接近,但他正在做相反的事情(解码而不是编码)。

Anand 的方法可行,但您很可能需要替换比空格和换行符更多的字符。请参阅此处的参考: http ://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

希望有帮助。

于 2013-08-13T19:39:20.057 回答
6

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

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

NSURL* url = [NSURL URLWithString:[strURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

这是对 URL 进行编码的完美方式,我正在使用它,而且它非常适合我。

希望对你有帮助!!!

于 2012-09-29T11:47:25.713 回答
4

这可能对解决 URL 编码问题的人有用,因为我的问题可能与已解决和接受的不同,这是我过去进行编码的方式,

-(NSString *)encodeURL:(NSString *)urlString
{
    CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString, NULL, CFSTR("!*'();:@&=+@,/?#[]"), kCFStringEncodingUTF8);
    return (NSString *)CFBridgingRelease(newString);
}
于 2013-05-06T09:08:00.647 回答
3

你可以试试这个

NSString *url = @"http://www.abc.com/param=Hi how are you";

NSString* encodedUrl = [url stringByAddingPercentEscapesUsingEncoding:
 NSASCIIStringEncoding];
于 2013-12-10T13:20:26.917 回答
3

我认为这对你有用

[strUrl stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]

URL 编码的本机方法。

于 2014-07-19T09:57:53.340 回答
2

斯威夫特 4.x

let originalString = "https://www.somedomain.com/folder/some cool file.jpg"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
print(escapedString!)
于 2017-11-16T05:01:48.603 回答
0

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

使用该字符串创建一个 NSURL,然后使用其上的方法(如主机、方案、路径、查询等)将其分开。然后使用 CFURLCreateStringByAddingPercentEscapes 对这些部分进行编码,然后您可以将它们重新组合到一个新的 NSURL 中。

于 2012-10-02T08:15:08.367 回答
-1

你能试试这个。

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

我不确定,但在我的情况下我已经解决了这个问题。希望这能解决你的问题。

于 2012-10-02T06:17:13.063 回答