URLWithString: devuelve nulo

93

puede ser muy fácil, pero no parece averiguar por qué está URLWithString:devolviendo cero aquí.

//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
fuente
1
¿Cuál es el valor de webNameantes de su llamada stringWithFormat:? Entonces, ¿cuál es el valor de stringURLantes de su llamada a URLWithString:? Úselo NSLog()para imprimirlos paso a paso, o para establecer puntos de corte e inspeccionar los valores a medida que se establecen.
Kevin Conner

Respuestas:

203

También debe escapar de los caracteres que no son ASCII en su URL codificada:

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

Probablemente pueda eliminar el escape de localisationName, ya que será manejado por el escape de toda la cadena.

gerry3
fuente
Tratando de entender por qué URLWithString da nulo aquí. Los documentos de Apple dicen "Debe ser una URL que se ajuste a RFC 2396. Este método analiza URLString de acuerdo con las RFC 1738 y 1808". Leer un poco ...
russau
1
LOL, copié una URL de un correo electrónico y esto sucedió. Gracias.
Echelon
1
se rompe si la URL tiene un #. stringByAddingPercentEscapesUsingEncodingconvierte # en% 2
Ali Saeed
3
La API anterior está obsoleta. Puede usar la siguiente API webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh
41

Utilice esta función si trabaja con archivos guardados en el administrador de archivos.

NSURL *_url = [NSURL fileURLWithPath:path];
Islam.Ibrahim
fuente
¡GRACIAS!
Recibía una
8

Supongo que necesitas usar -[NSString stringByAddingPercentEscapesUsingEncoding:]. Consulte el documento de Apple .

Otro comentario es que, como un veterano, me resulta un poco incómodo poner caracteres que no sean ASCII en un archivo fuente. Dicho esto, este documento de Apple dice que, a partir de 10.4, las cadenas UTF-16 están bien por dentro @"...". De alguna manera, GCC parece convertir correctamente el archivo fuente en Latin-1 en UTF-16 en el binario, pero creo que es más seguro usar caracteres ASCII de 7 bits solo dentro del código fuente y usar NSLocalizedString.

Yuji
fuente
2

Creo que tus personajes acentuados están deshaciendo las cosas; no serán manejados por -stringByAddingPercentEscapesUsingEncoding :.

Ben Gottlieb
fuente
2

NSURL URLWithString: @ "" devolverá nil si la URL no se ajusta a RFC 2396 y se deben escapar

Si lee rfc2396 en el enlace, obtendrá detalles

Un gran sitio que encontré para verificar dónde está el personaje ofensivo, elija la opción de ruta para la URL

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

Ryan Heitner
fuente
0

La llamada URLWithString: devolverá un nulo si la cadena que se le pasa está mal formada. Dado que NSURL devuelve nil para URL con formato incorrecto, NSLog su cadena y establezca puntos de interrupción para ver exactamente qué se está pasando a su método de creación NSURL. Si su URLWithString funciona con un valor codificado de forma rígida, eso es una prueba más de que lo que está pasando está mal formado. ver

Iggy
fuente
-1

Puede usar NSURL directamente sin NSString.

//.h archivo

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m archivo

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

Y paso la URL de otra vista (usando la variable NewsUrl) a esta vista.

Intentalo.

fady
fuente
Esta respuesta no abordó la pregunta en absoluto, que preguntaba por qué URLWithString: devolvía nulo. (Además, ni siquiera mostró un medio para cambiar una cadena a una URL)
ArtOfWarfare