URLWithString: Gibt null zurück

93

es mag sehr einfach sein, aber ich scheine nicht herauszufinden, warum URLWithString:hier nichts zurückkommt.

//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
quelle
1
Was ist der Wert webNamevor Ihrem Anruf bei stringWithFormat:? Was ist dann der Wert stringURLvor Ihrem Anruf bei URLWithString:? Verwenden Sie NSLog()diese Option , um sie Schritt für Schritt auszudrucken, oder legen Sie Haltepunkte fest und überprüfen Sie die festgelegten Werte.
Kevin Conner

Antworten:

202

Sie müssen auch die Nicht-ASCII-Zeichen in Ihrer fest codierten URL maskieren:

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

Sie können wahrscheinlich das Escapezeichen des localisationName entfernen, da es durch das Escapezeichen der gesamten Zeichenfolge behandelt wird.

gerry3
quelle
Ich versuche zu verstehen, warum URLWithString hier null gibt. In Apple-Dokumenten heißt es: "Muss eine URL sein, die RFC 2396 entspricht. Diese Methode analysiert URLString gemäß den RFCs 1738 und 1808." Lesen Sie etwas ...
Russau
1
LOL, ich habe eine URL aus einer E-Mail kopiert und das ist passiert! Vielen Dank.
Echelon
1
bricht ab, wenn die URL ein # enthält. stringByAddingPercentEscapesUsingEncodingkonvertiert # in% 2
Ali Saeed
1
Die oben genannte API ist veraltet. Sie könnten die folgende API verwenden webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh
41

Verwenden Sie diese Funktion, wenn Sie mit Dateien arbeiten, die im Dateimanager gespeichert sind.

NSURL *_url = [NSURL fileURLWithPath:path];
Islam.Ibrahim
quelle
DANKE! Ich bekam eine URL in der Mitte
Codrut
8

Ich denke, Sie müssen verwenden -[NSString stringByAddingPercentEscapesUsingEncoding:]. Siehe Apple-Dokument .

Ein weiterer Kommentar ist, dass es mir als Oldtimer etwas unangenehm ist, Nicht-ASCII-Zeichen in eine Quelldatei einzufügen. In diesem Apple-Dokument heißt es jedoch, dass ab 10.4 UTF-16-Zeichenfolgen im Inneren in Ordnung sind @"...". Irgendwie scheint GCC die Quelldatei in Latin-1 korrekt in UTF-16 in der Binärdatei zu konvertieren, aber ich denke, es ist am sichersten, 7-Bit-ASCII-Zeichen nur innerhalb des Quellcodes zu verwenden und zu verwenden NSLocalizedString.

Yuji
quelle
2

Ich denke, deine akzentuierten Charaktere werfen Dinge ab; Sie werden nicht von -stringByAddingPercentEscapesUsingEncoding: verarbeitet.

Ben Gottlieb
quelle
2

NSURL URLWithString: @ "" gibt null zurück, wenn die URL nicht RFC 2396 entspricht und sie maskiert werden müssen

Wenn Sie rfc2396 im Link durchlesen , erhalten Sie viele Details

Eine großartige Seite, die ich gefunden habe, um zu überprüfen, wo sich das beleidigende Zeichen befindet. Wählen Sie die Pfadoption für die URL

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

Ryan Heitner
quelle
0

Der Aufruf von URLWithString: gibt eine Null zurück, wenn die an ihn übergebene Zeichenfolge fehlerhaft ist. Da NSURL für fehlerhafte URLs null zurückgibt, protokollieren Sie Ihre Zeichenfolge und setzen Sie Haltepunkte, um genau zu sehen, was an Ihre NSURL-Erstellungsmethode übergeben wird. Wenn Ihr URLWithString mit einem fest codierten Wert arbeitet, ist dies ein weiterer Beweis dafür, dass alles, was Sie übergeben, fehlerhaft ist. sehen

Iggy
quelle
-1

Sie können NSURL direkt ohne NSString verwenden.

//.h Datei

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m Datei

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

Und ich übergebe die URL von einer anderen Ansicht (unter Verwendung der NewsUrl-Variablen) an diese Ansicht.

Versuch es.

fady
quelle
Diese Antwort ging überhaupt nicht auf die Frage ein, warum URLWithString: null zurückgab. (Außerdem haben Sie nicht einmal ein Mittel zum Ändern einer Zeichenfolge in eine URL gezeigt.)
ArtOfWarfare