Почему [NSURL URLWithString:] экранирует некоторые символы в строке url и не для других символов?

#iphone #ios #nsurl

#iPhone #iOS #nsurl

Вопрос:

Я обнаружил, что метод [NSURL URLWithString:] экранирует некоторые символы в строке url, переданной ему автоматически. например, он экранирует скобки. Но строка url содержит другие недопустимые символы url, такие как < и >, из-за чего метод возвращает nil

 [[NSURL URLWithString:@"http://foo.bar/?key[]=value[]"] absoluteString]
  

возвращает тот же результат с

 [@"http://foo.bar/?key[]=value[]" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
  

в то время как,

 [NSURL URLWithString:@"http://foo.bar/?key[]=value[]<>"] returns nil, not a url with an escaped string.
  

что именно происходит во время инициализации экземпляра NSURL? почему он экранирует (возможно) только скобки?

Комментарии:

1. Вы все еще получаете nil, когда делаете NSURL *myUrl = [NSURL URLWithString:[@"http://foo.bar/?key[]=value[]<>" stringByAddingPercentExcapesUsingEncoding:NSUTF8Encoding]]; это?

Ответ №1:

NSUrl URLWithString: не экранирует строку, как указано в документах:

Этот метод ожидает, что urlString будет содержать любые необходимые процентные escape-коды, которые ‘:’, ‘/’, ‘%’, ‘#’, ‘;’, и ‘@’. Обратите внимание, что экранирование ‘%’ переводится через UTF-8

Однако вы должны быть в состоянии выполнить следующее, используя stringByAddingPercentEscapesUsingEncoding: :

 NSString *myString = @"http://foo.bar/?key[]=value[]<>";
NSURL *myUrl = [NSURL URLWithString:[myString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
  

Комментарии:

1. Использование stringByAddingPercentEscapesUsingEncoding упрощает процесс, за исключением того, что он не экранирует амперсанд. Однако меня беспокоит не то, что URLWithString возвращает nil, когда я передаю не экранированную строку, а то, что URLWithString автоматически экранирует скобки. Я думаю, что он НЕ должен экранировать какие-либо символы =(