URLWithString: возвращает ноль


93

это может быть очень легко, но я, кажется, не понимаю, почему здесь URLWithString:возвращается nil.

//localisationName is a arbitrary string here
NSString* webName = [localisationName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString* stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@,Montréal,Communauté-Urbaine-de-Montréal,Québec,Canadae&output=csv&oe=utf8&sensor=false&key=", webName];
NSURL* url = [NSURL URLWithString:stringURL];

1
Какова стоимость webNameдо вашего звонка stringWithFormat:? Тогда какова стоимость stringURLдо вашего звонка URLWithString:? Используйте NSLog()для их пошаговой печати или для установки точек останова и проверки значений по мере их установки.
Кевин Коннер,

Ответы:


203

Вам также необходимо экранировать символы, отличные от ASCII, в жестко заданном URL-адресе:

//localisationName is a arbitrary string here
NSString* webName = [localisationName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString* stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@,Montréal,Communauté-Urbaine-de-Montréal,Québec,Canadae&output=csv&oe=utf8&sensor=false", webName];
NSString* webStringURL = [stringURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL* url = [NSURL URLWithString:webStringURL];

Вероятно, вы можете удалить экранирование localisationName, поскольку оно будет обработано экранированием всей строки.


Пытаюсь понять, почему URLWithString здесь дает nil. В документации Apple говорится: «Должен быть URL-адрес, соответствующий RFC 2396. Этот метод анализирует URLString в соответствии с RFC 1738 и 1808.». Читаю ...
Руссау

1
LOL, я скопировал URL-адрес из электронного письма, и это произошло! Спасибо.
Echelon

1
прерывается, если в URL есть #. stringByAddingPercentEscapesUsingEncodingконвертирует # в% 2
Али Саид

3
Вышеуказанный API устарел. Вы можете использовать следующий API webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh

41

Используйте эту функцию, если вы имеете дело с файлом, сохраненным в файловом менеджере.

NSURL *_url = [NSURL fileURLWithPath:path];

СПАСИБО! Я получал URL-адрес "обрезан посередине"
codrut

8

Я думаю, вам нужно использовать -[NSString stringByAddingPercentEscapesUsingEncoding:]. См. Документ Apple .

Другой комментарий заключается в том, что мне, как старому таймеру, немного неудобно помещать символы, отличные от ASCII, в исходный файл. Тем не менее, в этом документе Apple говорится, что, начиная с 10.4, строки UTF-16 внутри в порядке @"...". Каким-то образом кажется, что GCC правильно конвертирует исходный файл в Latin-1 в UTF-16 в двоичном формате, но я думаю, что безопаснее всего использовать 7-битные символы ASCII только внутри исходного кода и использовать NSLocalizedString.


2

Я думаю, что ваши акцентированные персонажи сбивают с толку; они не будут обрабатываться -stringByAddingPercentEscapesUsingEncoding :.


2

NSURL URLWithString: @ "" вернет nil, если URL не соответствует RFC 2396, и они должны быть экранированы

Если вы прочитаете rfc2396 по ссылке, вы получите множество деталей

Я нашел отличный сайт для проверки того, где находится оскорбительный персонаж, выберите вариант пути для URL

http://www.websitedev.de/temp/rfc2396-check.html.gz


0

Вызов URLWithString: вернет ноль, если переданная ему строка имеет неправильный формат. Поскольку NSURL возвращает nil для искаженных URL-адресов, NSLog ваша строка и установка точек останова, чтобы точно видеть, что передается вашему методу создания NSURL. Если ваш URLWithString работает с жестко заданным значением, это еще одно доказательство того, что все, что вы передаете, искажено. видеть


-1

Вы можете использовать NSURL напрямую без NSString.

//.h файл

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

@property (nonatomic, retain) IBOutlet UIWebView *webView;

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m файл

[webView loadRequest:[NSURLRequest requestWithURL:NewsUrl]];

И я передаю URL-адрес из другого представления (используя переменную NewsUrl) в это представление.

Попытайся.


Этот ответ вообще не касался вопроса, который спрашивал, почему URLWithString: возвращает ноль. (Кроме того, вы даже не показали средства изменения строки на URL.)
ArtOfWarfare
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.