如何比较两个实际上等价但具有装饰性string差异的NSURL?
在IOS下,我希望找出两个相同或不同的NSURL
,但是指向相同的目的地。 例如http://google.com
与http://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.com
和http://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。