URLWithString: zwraca nil

93

może to być bardzo łatwe, ale nie wydaje mi się, aby dowiedzieć się, dlaczego URLWithString:zwraca tutaj zero.

//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];
gcamp
źródło
1
Jaka jest wartość webNameprzed Twoim telefonem stringWithFormat:? Jaka jest zatem wartość stringURLprzed twoim wezwaniem URLWithString:? Służy NSLog()do drukowania ich krok po kroku lub ustawiania punktów przerwania i sprawdzania wartości podczas ich ustawiania.
Kevin Conner

Odpowiedzi:

203

W zakodowanym na stałe adresie URL musisz również zmienić znaczenie znaków spoza zestawu ASCII:

//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];

Prawdopodobnie możesz usunąć znak ucieczki localisationName, ponieważ zostanie on obsłużony przez zmianę znaczenia całego ciągu.

gerry3
źródło
Próbuję zrozumieć, dlaczego URLWithString podaje tutaj zero. Dokumenty Apple mówią „Musi to być adres URL zgodny ze specyfikacją RFC 2396. Ta metoda analizuje ciąg znaków URL zgodnie ze specyfikacjami RFC 1738 i 1808”. Trochę czytać ...
russau
1
LOL, skopiowałem adres URL z e-maila i tak się stało! Dzięki.
Echelon
1
psuje się, jeśli adres URL zawiera #. stringByAddingPercentEscapesUsingEncodingkonwertuje # na% 2
Ali Saeed
3
Powyższy interfejs API został wycofany. Możesz użyć następującego interfejsu API webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh
41

Użyj tej funkcji, jeśli masz do czynienia z plikiem zapisanym w menedżerze plików.

NSURL *_url = [NSURL fileURLWithPath:path];
Islam. Ibrahim
źródło
DZIĘKUJĘ CI!
Otrzymywałem ``
8

Myślę, że musisz użyć -[NSString stringByAddingPercentEscapesUsingEncoding:]. Zobacz dokument Apple .

Innym komentarzem jest to, że jako stary timer uważam, że umieszczanie znaków spoza ASCII w pliku źródłowym jest trochę trudne. To powiedziawszy, ten dokument Apple mówi, że począwszy od 10.4, ciągi znaków UTF-16 są w porządku w środku @"...". W jakiś sposób GCC wydaje się poprawnie konwertować plik źródłowy w Latin-1 do UTF-16 w formacie binarnym, ale myślę, że najbezpieczniej jest używać 7-bitowych znaków ASCII tylko w kodzie źródłowym i używać NSLocalizedString.

Yuji
źródło
2

Myślę, że wasze akcentowane postacie odrzucają rzeczy; nie będą obsługiwane przez -stringByAddingPercentEscapesUsingEncoding :.

Ben Gottlieb
źródło
2

NSURL URLWithString: @ "" zwróci wartość nil, jeśli adres URL nie jest zgodny ze specyfikacją RFC 2396 i musi zawierać znaki zmiany znaczenia

Jeśli przeczytasz rfc2396 w linku, otrzymasz mnóstwo szczegółów

Świetna witryna do sprawdzania, gdzie znajduje się obraźliwy znak, wybierz opcję ścieżki dla adresu URL

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

Ryan Heitner
źródło
0

Wywołanie URLWithString: zwróci wartość zerową, jeśli przekazany do niego ciąg jest zniekształcony. Ponieważ NSURL zwraca nil dla źle sformułowanych adresów URL, NSLoguj swój ciąg i ustaw punkty przerwania, aby zobaczyć dokładnie, co jest przesyłane do metody tworzenia NSURL. Jeśli Twój URLWithString działa z wartością zakodowaną na stałe, jest to kolejny dowód na to, że cokolwiek przekazujesz, jest źle sformułowane. widzieć

Iggy
źródło
-1

Możesz użyć nazwy NSURL bezpośrednio, bez NSString.

//.h plik

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m plik

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

I przekazuję adres URL z innego widoku (używając zmiennej NewsUrl) do tego widoku.

Spróbuj.

fady
źródło
Ta odpowiedź w ogóle nie odpowiadała na pytanie, które dotyczyło pytania, dlaczego URLWithString: zwraca nil. (Co więcej, nawet nie
pokazałeś