正确理解网址

时间:2014-08-16 19:19:12

标签: objective-c parsing nsstring nsxmlparser nsurl

我正在编写RSS阅读器并从Feed中获取文章网址,但在使用NSXMLParser进行解析时通常会使用无效的网址。有时在url的末尾有额外的符号(例如\ n,\ t)。这个问题我修好了。 最困难的问题是具有不允许进行url编码的字符的查询的网址。 URL-request http://www.bbc.co.uk/news/education-23809095#sa-ns_mchannel=rss&ns_source=PublicRSS20-sa的工作网址 '#'字符将被“stringByAddingPercentEscapesUsingEncoding:”方法替换为“%23”,并且不起作用。网站将说明未找到的页面。我相信'#'后面的字符是一个查询字符串。 有没有办法正确地从feed中获取(编码)任何url,至少总是从xml中删除查询字符串?

1 个答案:

答案 0 :(得分:3)

您可以使用两种方法创建合法的URL字符串,方法是使用stringByAddingPercentEncodingWithAllowedCharacters或使用CFURL核心基础类,它为您提供了一系列选项。

示例1(NSCharacterSet):

NSString *nonFormattedURL = @"http://www.bbc.co.uk/news/education-23809095#sa-ns_mchannel=rss&ns_source=PublicRSS20-sa";

NSLog(@"%@", [nonFormattedURL stringByAddingPercentEncodingWithAllowedCharacters:[[NSCharacterSet illegalCharacterSet] invertedSet]]);

这仍然通过反转NSCharacterSet对象中的illegalCharacterSet来保持哈希标记的位置。如果你想要更多控制,你也可以创建自己的可变集。

示例2(CFURL.h)

NSString *nonFormattedURL = @"http://www.bbc.co.uk/news/education-23809095#sa-ns_mchannel=rss&ns_source=PublicRSS20-sa";
CFAllocatorRef allocator = CFAllocatorGetDefault();
CFStringRef formattedURL = CFURLCreateStringByAddingPercentEscapes(allocator,
                                                                       (__bridge CFStringRef) nonFormattedURL,
                                                                       (__bridge CFStringRef) @"#", //leave unescaped
                                                                       (__bridge CFStringRef) @"", // legal characters to be escaped like / = # ? etc
                                                                       NSUTF8StringEncoding); // encoding



NSLog(@"%@",  formattedURL);

与上面的代码相同但有更多控制:根据指定的编码用等效百分比转义序列替换某些字符,例如参见日志。