#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 автоматически экранирует скобки. Я думаю, что он НЕ должен экранировать какие-либо символы =(