Подтвердить что ты не робот

Как сравнить два NSURL, которые практически эквивалентны, но имеют различия в косметических строках?

В IOS я хочу идентифицировать пары NSURL, которые либо идентичны, либо немного отличаются друг от друга, но относятся к тому же месту назначения. Например http://google.com vs http://google.com/.

isEquals сообщает эти NSURL как разные. Я также не могу найти способ получить "каноническую" или "нормализованную" форму NSURL для сравнения этих форм.

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?

4b9b3361

Ответ 1

Согласно RFC 2616, http://google.com и http://google.com/ эквивалентны. Вот что он говорит (раздел 3.2.3):

При сравнении двух URI, чтобы решить, соответствуют ли они или нет, клиенту СЛЕДУЕТ использовать сопоставление всех октетов по октету по октету с учетом этих случаев:

  • Порт, который пуст или не указан, эквивалентен порту по умолчанию для этой URI-ссылки;

  • Сравнение имен хостов ДОЛЖНЫ быть нечувствительными к регистру,

  • Сравнение имен схем ДОЛЖНО быть нечувствительным к регистру,

  • Пустой abs_path эквивалентен абс_путу "/".

Для справки синтаксис задается как http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]

К сожалению, NSURL должен поддерживать схемы, отличные от HTTP, поэтому он не может сделать предположение, что RFC 2616 предоставляет общее правило. Я считаю, что ваше лучшее исправление заключается в создании категории с помощью собственного метода сравнения для http-URL, который специально проверяет пустой абсолютный путь.