如何比较两个实际上等价但具有装饰性string差异的NSURL?

在IOS下,我希望找出两个相同或不同的NSURL ,但是指向相同的目的地。 例如http://google.comhttp://google.com/

isEquals报告那些NSURLs不同。 我也不能find一种获得NSURL的“规范”或“规范化”forms来比较这些forms的方法。

 NSURL *a = [NSURL URLWithString:@"http://google.com"]; NSURL *b = [NSURL URLWithString:@"http://google.com/"]; if([a isEqual:b]) { NSLog(@"Same"); // Not run } if([[a absoluteURL] isEqual:[b absoluteURL]]) { NSLog(@"Same"); // Still not run } if([[a URLByStandardizingPath] isEqual:[b URLByStandardizingPath]]) { NSLog(@"Same"); // Still not run } 

如何比较两个NSURL而忽略不影响URL意图的string差异?

根据RFC 2616 , http://google.comhttp://google.com/是等同的。 这就是它所说的(第3.2.3节):

当比较两个URI来决定它们是否匹配时,一个客户端应该使用一个区分大小写的整个URI的八位字节比较,除了以下例外:

  • 一个空或者没有给出的端口相当于该URI引用的默认端口;

  • 主机名称比较必须不区分大小写;

  • scheme名称的比较必须不区分大小写;

  • 一个空的abs_path相当于一个“/”的abs_path。

作为参考,语法为http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]

不幸的是, NSURL必须支持HTTP以外的scheme,所以它不能假设RFC 2616提供了一个通用的规则。 我认为你最好的解决办法是用你自己的比较方法来创build一个类别的http URL,专门检查一个空的绝对path。