2011-10-27 10 views
29

El método stringByReplacingPercentEscapesUsingEncoding no funciona correctamente, ya que no está descodificando símbolos especiales que no comienzan con un carácter%, es decir, el carácter +. ¿Alguien sabe de un mejor método para hacer esto en iOS?Cómo decodificar URL en iOS - Objetivo C

Aquí es lo que estoy usando actualmente:

NSString *path = [@"path+with+spaces" 
    stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

Y aquí es un ejemplo de la salida:

ruta + con + espacios

+3

puede usted por favor publicar su código o un ejemplo de dónde y cómo ese método no funciona correctamente para usted? – Carter

+0

acaba de hacer, gracias. – VinnyD

+0

+ es un carácter URL válido. – titaniumdecoy

Respuesta

51
NSString *path = [[@"path+with+spaces" 
    stringByReplacingOccurrencesOfString:@"+" withString:@" "] 
    stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

Tenga en cuenta que la sustitución más-para-el espacio se utiliza solamente en los datos application/x-www-form-urlencoded - la parte cadena de consulta de una URL o el cuerpo de una solicitud POST.

+2

hay otros caracteres que el + que necesita decodificarse, ¿no? – VinnyD

+0

No. http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1 –

+0

Cuando traté de decodificar una cadena @ "abcjhjhdfjhafjakhfjaklfj12346890 (*^$ # @@@ # $% ^^ ........ ", utilizando este método, devuelve nil. Parece que stringByReplacingPercentEscapesUsingEncoding está causando algunos problemas debido a" Devuelve nil si la transformación no es posible (es decir, el porcentaje de escape da una secuencia de bytes no legal en la codificación dada). "(de NSURL.h). Así que solo un aviso para aquellos que se encontraron con este problema haciendo una categoría como yo. –

1

Si usted está tratando de reemplazar el signo más con porcentaje de escapes, realice un reemplazo de cadena de "+" a "" (espacio simple). Luego use stringByAddingPercentEscapesUsingEncoding: para agregar el porcentaje de escapes.

El signo más es uno de los muchos caracteres de URL reservados que nunca se codifica.

(stringByReplacingPercentEscapesUsingEncoding: decodifica los escapes por ciento)

20
// Decode a percent escape encoded string. 
- (NSString*) decodeFromPercentEscapeString:(NSString *) string { 
return (__bridge NSString *) CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, 
                 (__bridge CFStringRef) string, 
                 CFSTR(""), 
                 kCFStringEncodingUTF8); 
} 

http://cybersam.com/ios-dev/proper-url-percent-encoding-in-ios

Ésta parece ser la forma preferida porque ... "Al parecer," esto es una manzana "error" es consciente de, pero no han hecho nada al respecto todavía .. . (http://simonwoodside.com/weblog/2009/4/22/how_to_really_url_encode/)

+0

¡Perfecto! ¡Salud! – Marcelo

1

rápida 2:

extension String { 

    func uriDecodedString() -> String? { 
     return self.stringByReplacingOccurrencesOfString("+", withString: " ").stringByRemovingPercentEncoding 
    } 

} 
Cuestiones relacionadas