¿Cómo codifico en URL una cadena?

Resuelto xonegirlz asked hace 54 años • 24 respuestas

Tengo una cadena de URL ( NSString) con espacios y &caracteres. ¿Cómo codifico en URL toda la cadena (incluidos el &carácter comercial y los espacios)?

xonegirlz avatar Jan 01 '70 08:01 xonegirlz
Aceptado

Desafortunadamente, stringByAddingPercentEscapesUsingEncodingno siempre funciona al 100%. Codifica caracteres que no son URL pero deja los caracteres reservados (como barra diagonal /y signo comercial &) solo. Aparentemente, este es un error que Apple conoce, pero como aún no lo han solucionado, he estado usando esta categoría para codificar una cadena mediante URL:

@implementation NSString (NSString_Extended)

- (NSString *)urlencode {
    NSMutableString *output = [NSMutableString string];
    const unsigned char *source = (const unsigned char *)[self UTF8String];
    int sourceLen = strlen((const char *)source);
    for (int i = 0; i < sourceLen; ++i) {
        const unsigned char thisChar = source[i];
        if (thisChar == ' '){
            [output appendString:@"+"];
        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || 
                   (thisChar >= 'a' && thisChar <= 'z') ||
                   (thisChar >= 'A' && thisChar <= 'Z') ||
                   (thisChar >= '0' && thisChar <= '9')) {
            [output appendFormat:@"%c", thisChar];
        } else {
            [output appendFormat:@"%%%02X", thisChar];
        }
    }
    return output;
}

Usado así:

NSString *urlEncodedString = [@"SOME_URL_GOES_HERE" urlencode];

// Or, with an already existing string:
NSString *someUrlString = @"someURL";
NSString *encodedUrlStr = [someUrlString urlencode];

Esto también funciona:

NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                            NULL,
                            (CFStringRef)unencodedString,
                            NULL,
                            (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                            kCFStringEncodingUTF8 );

Algunas buenas lecturas sobre el tema:

¿El porcentaje de iPhone Objective-c codifica una cadena?
Codificación de URL Objective-C y Swift

http://cybersam.com/programming/proper-url-percent-encoding-in-ios
https://devforums.apple.com/message/15674#15674 http://simonwoodside.com/weblog/2009/4/ 22/how_to_really_url_encode/

chown avatar Nov 11 '2011 01:11 chown

Esto podría ser útil

NSString *sampleUrl = @"http://www.google.com/search.jsp?params=Java Developer";
NSString* encodedUrl = [sampleUrl stringByAddingPercentEscapesUsingEncoding:
 NSUTF8StringEncoding];

Para iOS 7+, la forma recomendada es:

NSString* encodedUrl = [sampleUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

Puede elegir el juego de caracteres permitido según los requisitos del componente URL.

Nishant avatar May 28 '2013 20:05 Nishant

Se agregaron nuevas API desde que se seleccionó la respuesta; Ahora puede utilizar NSURLUtilities. Dado que diferentes partes de las URL permiten caracteres diferentes, utilice el juego de caracteres correspondiente. El siguiente ejemplo codifica para su inclusión en la cadena de consulta:

encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];

Para convertir '&' específicamente, deberá eliminarlo del conjunto de consultas de URL o utilizar un conjunto diferente, ya que '&' está permitido en una consulta de URL:

NSMutableCharacterSet *chars = NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;
[chars removeCharactersInRange:NSMakeRange('&', 1)]; // %26
encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:chars];
Peter DeWeese avatar Mar 13 '2014 19:03 Peter DeWeese

Ejemplo de Swift 2.0 (compatible con iOS 9)

extension String {

  func stringByURLEncoding() -> String? {

    let characters = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as! NSMutableCharacterSet

    characters.removeCharactersInString("&")

    guard let encodedString = self.stringByAddingPercentEncodingWithAllowedCharacters(characters) else {
      return nil
    }

    return encodedString

  }

}
Oliver Atkinson avatar Aug 03 '2015 15:08 Oliver Atkinson