cfurlcreatestringbyaddingpercentescapes addingpercentencoding ios url-encoding

ios - addingpercentencoding - url encode swift 4



iOS: ¿Cómo hacer una correcta codificación de URL? (10)

No puedo abrir una URL en UIWebView así que busqué y encontré que necesito codificar la URL, así que traté de codificarla, pero tengo un problema con la codificación de la URL: mi URL es http://somedomain.com/data/Témp%20Page%20-%20Open.html (no es la URL real).

Estoy preocupado por %20 que intenté reemplazar usando stringByReplacingOccuranceOfString:@"" withString:@"" , me da la URL que quería como http://somedomain.com/data/Témp Page - Open.html Sin embargo, es no se abre en UIWebView pero sorprendentemente se abre en Safari y FireFox perfecto. Incluso abro una URL no codificada que se convierte automáticamente y abro la página que estoy buscando.

Tengo Google para la codificación de URL y me señala diferentes resultados que ya verifiqué, ¡¡pero ningún resultado me ayudó! Probé diferentes funciones de respuestas en diferentes preguntas de codificación de URL, pero solo cambió todos los caracteres especiales y me gustó mi URL, http%3A%2F%2Fsomedomain.com%2Fdata%2FT... que no se puede abrir en UIWebView e incluso en cualquier navegador.

Da el siguiente Error Log en el UIWebView delegate

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { }

Código de error: 101 y Descripción: Dominio de error = WebKitErrorDomain Code = 101 "No se pudo completar la operación (error de WebKitErrorDomain 101)" UserInfo = 0x6e4cf60 {}


¿Puedes por favor probar esto?

//yourURL contains your Encoded URL yourURL = [yourURL stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; yourURL = [yourURL stringByReplacingOccurrencesOfString:@"/n" withString:@""]; NSLog(@"Keyword:%@ is this",yourURL);

No estoy seguro, pero he resuelto el uso de esto en mi caso. Espero que esto solucione el tuyo.


Creo que esto funcionará para ti

[strUrl stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]

El método nativo para la codificación de URL.


Es muy simple codificar la URL en iPhone. Es como sigue

NSString* strURL = @"http://somedomain.com/data/Témp Page - Open.html"; NSURL* url = [NSURL URLWithString:[strURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

Es una forma perfecta de codificar la URL, la estoy usando y funciona perfectamente conmigo.

¡¡¡Espero que te ayude!!!


Es probable que deba dividir la URL en sus partes constituyentes y luego la URL codifique el host y la ruta, pero no el esquema. Luego vuelve a armarlo.

Cree un NSURL con la cadena y luego use los métodos como host, esquema, ruta, consulta, etc. para separarlo. Luego use CFURLCreateStringByAddingPercentEscapes para codificar las partes y luego puede volver a ponerlas juntas en un nuevo NSURL.


Esto puede ser útil para alguien que llegue a esta pregunta para la codificación de URL, ya que mi pregunta probablemente fue diferente y se resolvió y aceptó , esta es la forma en que solía hacer la codificación.

-(NSString *)encodeURL:(NSString *)urlString { CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString, NULL, CFSTR("!*''();:@&=+@,/?#[]"), kCFStringEncodingUTF8); return (NSString *)CFBridgingRelease(newString); }


Hice algunas pruebas y creo que el problema no es realmente con UIWebView sino que NSURL no acepta la URL debido a que la é en "Témp" no está codificada correctamente. Esto hará que +[NSURLRequest requestWithURL:] y -[NSURL URLWithString:] devuelvan nil ya que la cadena contiene una URL con formato incorrecto. Supongo que luego terminas usando una solicitud nil con -[UIViewWeb loadRequest:] cual no es bueno.

Ejemplo:

NSLog(@"URL with é: %@", [NSURL URLWithString:@"http://host/Témp"]); NSLog(@"URL with encoded é: %@", [NSURL URLWithString:@"http://host/T%C3%A9mp"]);

Salida:

2012-10-02 12:02:56.366 test[73164:c07] URL with é: (null) 2012-10-02 12:02:56.368 test[73164:c07] URL with encoded é: http://host/T%C3%A9mp

Si realmente desea tomar prestado el manejo elegante de las URL malformadas que tiene WebKit y no quiere implementarlo usted mismo, puede hacer algo como esto, pero es muy feo:

UIWebView *webView = [[[UIWebView alloc] initWithFrame:self.view.frame] autorelease]; NSString *url = @"http://www.httpdump.com/texis/browserinfo/Témp.html"; [webView loadHTMLString:[NSString stringWithFormat: @"<script>window.location=%@;</script>", [[[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:url options:NSJSONReadingAllowFragments error:NULL] encoding:NSUTF8StringEncoding] autorelease]] baseURL:nil];


La forma más sencilla es usar:

NSString *encodedString = [rawString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

iDhaval estaba cerca, pero lo estaba haciendo al revés (decodificación en lugar de codificación).

La forma de Anand funcionaría, pero lo más probable es que tenga que reemplazar más caracteres que espacios y líneas nuevas. Vea la referencia aquí: http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

Espero que ayude.


La respuesta que proporcionó @Dhaval Vaishnani solo es parcialmente correcta. Este método trata el ? , = y & caracteres como para no ser codificados, ya que son válidos en una URL. Por lo tanto, para codificar una cadena arbitraria para que se use de manera segura como parte de una URL, no puede usar este método. En su lugar, debe recurrir al uso de CoreFoundation y CFURLRef :

NSString *unsafeString = @"this &string= confuses ? the InTeRwEbZ"; CFStringRef safeString = CFURLCreateStringByAddingPercentEscapes ( NULL, (CFStringRef)unsafeString, NULL, CFSTR("/%&=?$#+-~@<>|//*,.()[]{}^!"), kCFStringEncodingUTF8 );

No olvide deshacerse de la propiedad de la cadena resultante utilizando CFRelease(safeString); .

Además, parece que a pesar del título, OP está buscando decodificar y no codificar una cadena. CFURLRef tiene otra llamada de función similar para ser utilizada para eso:

NSString *escapedString = @"%32%65BCDEFGH"; CFStringRef unescapedString = CFURLCreateStringByReplacingPercentEscapesUsingEncoding ( NULL, (CFStringRef)escapedString, CFSTR(""), kCFStringEncodingUTF8 );

Una vez más, no se olvide de la gestión adecuada de la memoria.


Puedes probar esto

NSString *url = @"http://www.abc.com/param=Hi how are you"; NSString* encodedUrl = [url stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];


Swift 4.x

let originalString = "https://www.somedomain.com/folder/some cool file.jpg" let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) print(escapedString!)