Tengo un NSString como este:

http://www.

pero quiero transformar en:

http%3A%2F%2Fwww.

¿Cómo puedo hacer esto?

  • Tengo una cadena cifrada como ùÕ9y^VêÏÊEØ®.ú/V÷ÅÖêú2Èh~ – ninguna de las soluciones a continuación se parece a la dirección de este!
InformationsquelleAutor Usi Usi | 2011-11-10

12 Comentarios

  1. 319

    Escapar los caracteres que desea es un poco más de trabajo.

    Código de ejemplo

    iOS7 y arriba:

    NSString *unescaped = @"http://www";
    NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
    NSLog(@"escapedString: %@", escapedString);

    NSLog de salida:

    escapedString: http%3A%2F%2Fwww

    Los siguientes son útiles codificación URL conjuntos de caracteres:

    URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
    URLHostAllowedCharacterSet      "#%/<>[email protected]\^`{|}
    URLPasswordAllowedCharacterSet  "#%/:<>[email protected][\]^`{|}
    URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
    URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
    URLUserAllowedCharacterSet      "#%/:<>[email protected][\]^`

    La creación de un conjunto de caracteres la combinación de todas las anteriores:

    NSCharacterSet *URLCombinedCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@" \"#%/:<>[email protected][\]^`{|}"] invertedSet];

    La creación de un Base64

    En el caso de Base64 conjunto de caracteres:

    NSCharacterSet *URLBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"/+=\n"] invertedSet];

    Para Swift 3.0:

    var escapedString = originalString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)

    Para Swift 2.x:

    var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())

    Nota: stringByAddingPercentEncodingWithAllowedCharacters también codificar en UTF-8 caracteres necesidad de codificación.

    Pre iOS7 uso de los Cimientos Básicos

    El uso de los Cimientos Básicos Con ARCO:

    NSString *escapedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
        NULL,
       (__bridge CFStringRef) unescaped,
        NULL,
        CFSTR("!*'();:@&=+$,/?%#[]\" "),
        kCFStringEncodingUTF8));

    El uso de los Cimientos Básicos Sin ARCO:

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

    Nota: -stringByAddingPercentEscapesUsingEncoding no producirá la codificación correcta, en este caso no va a codificar nada devolución de la misma cadena.

    stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding codifica 14 characrters:

    `#%^{}[]|\»<> más el carácter de espacio como por ciento escapado.

    testString:

    " `[email protected]#$%^&*()_+-={}[]|\:;\"'<,>.?/AZaz"  

    encodedString:

    "%20%[email protected]%23$%25%5E&*()_+-=%7B%7D%5B%5D%7C%5C:;%22'%3C,%3E.?/AZaz"  

    Nota: considerar si este conjunto de caracteres satisfacer sus necesidades, si no cambiar según sea necesario.

    RFC 3986 caracteres que requieren codificación (% añadido, ya que es la codificación del carácter de prefijo):

    «!#$&aplicaciones de;'()*+,/:;[email protected][]%»

    Algunos «sin reservas a los personajes» son, además, codificado:

    «\n\r \»%-.<>\^_`{|}~»

    • Nota también puede utilizar NSString del -stringByAddingPercentEscapesUsingEncoding método.
    • Este código también pérdidas de memoria a menos que se utilice un __bridge_retained emitir de conformidad con el ARCO, o llame CFRelease en algún punto sobre el valor de retorno de CFURLCreateStringByAddingPercentEscapes.
    • Ah, sí, ahora recuerdo el funky stringByAddingPercentEscapesUsingEncoding comportamiento. Sólo codifica ‘&’ y ‘=’ o algo ridículo como eso.
    • Bajo el ARCO de la respuesta inicial no fuga y la sugerencia de @Mike es correcta, he añadido alternativas para el uso bajo el ARCO.
    • también bajo el ARCO que usted necesita para establecer el puente para el sin escape cadena: … (__puente CFStringRef) sin escape, …
    • Gracias a @Praveen! He actualizado la respuesta de ARCO.
    • De acuerdo a la RFC1738 usted necesita para codificar caracteres adicionales así. Así que, aunque esto no responder a la OP de la pregunta, se tiene una utilidad limitada como un propósito general de la dirección URL del codificador. Por ejemplo, no manejar no caracteres alfanuméricos, tales como alemán, de la diéresis.
    • Tal vez para más facilidad de uso, la solución debe contener el espacio y los caracteres de comillas? Algo así como CFSTR("!*'();:@&=+$,/?%#[]\" ")
    • Respuesta actualizada.
    • Esto no funciona (para iOS 7 parte). Esto no convertir & a %26.
    • Crear el conjunto de caracteres que necesita de un NSString con characterSetWithCharactersInString, tomar la inversa con invertedSet y el uso que con stringByAddingPercentEncodingWithAllowedCharacters. Véase un ejemplo de esto PARA responder.
    • La documentación de Apple dice: Important: Although the NSString class provides built-in methods for adding percent escapes, you usually should not use them.

  2. 22

    Se llama La codificación URL. Más aquí.

    -(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
        return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
               (CFStringRef)self,
               NULL,
               (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
               CFStringConvertNSStringEncodingToEncoding(encoding));
    }
    • Esto sería mucho más útil si algunos de los contenidos de los enlaces publicados fueron incluidos en la respuesta.
    • CFURLCreateStringByAddingPercentEscapes() está en desuso. Uso [NSString stringByAddingPercentEncodingWithAllowedCharacters:] lugar.
  3. 7

    Este no es mi solución. Alguien escribió en stackoverflow pero he olvidado cómo hacerlo.

    De alguna manera, esta solución funciona «bien». Se encarga de diacríticos, caracteres chinos, y casi cualquier otra cosa.

    - (NSString *) URLEncodedString {
        NSMutableString * output = [NSMutableString string];
        const char * source = [self UTF8String];
        int sourceLen = strlen(source);
        for (int i = 0; i < sourceLen; ++i) {
            const unsigned char thisChar = (const unsigned char)source[i];
            if (false && 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;
    }

    Si alguien me diría que escribió este código, el que realmente va a apreciar. Básicamente tiene alguna explicación de por qué esta cadena codificada decodificar exactamente como lo desea.

    He modificado su solución un poco. Me gusta el espacio para ser representado con %20 en lugar de a +. Eso es todo.

    • Original código: stackoverflow.com/questions/3423545/…
    • ¿qué es [auto UTF8String] ?
    • esta es una función que puedes poner dentro de una categoría de NSString. Así, el yo es NSStirng y [auto UTF8String] devuelve, assumingly, su cadena en formato UTF8.
  4. 4
     NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NUL,(CFStringRef)@"parameter",NULL,(CFStringRef)@"!*'();@&+$,/?%#[]~=_-.:",kCFStringEncodingUTF8 );
    
    NSURL * url = [[NSURL alloc] initWithString:[@"address here" stringByAppendingFormat:@"?cid=%@",encodedString, nil]];
    • liberación encodedString y la url. este código es acerca de codificar parámetro. Para codificar toda la dirección de paso de cadena en lugar de «parámetro».
    • Esto funcionó para mí… codificada incluso el & personaje que estaba teniendo problemas con el.
  5. 3

    Esto puede funcionar en Objective C ARCO.Uso CFBridgingRelease para echar los Cimientos Básicos de estilo de objeto como un Objetivo-C objeto y la transferencia de la propiedad del objeto a ARCO .Ver Función CFBridgingRelease aquí.

    + (NSString *)encodeUrlString:(NSString *)string {
    return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes
                             (kCFAllocatorDefault,
                              (__bridge CFStringRef)string,
                              NULL,
                              CFSTR("!*'();:@&=+$,/?%#[]"),
                              kCFStringEncodingUTF8)
                             );}
  6. 2

    Swift iOS:

    Sólo Para Información : he usado este:

    extension String {
    
        func urlEncode() -> CFString {
            return CFURLCreateStringByAddingPercentEscapes(
                nil,
                self,
                nil,
                "!*'();:@&=+$,/?%#[]",
                CFStringBuiltInEncodings.UTF8.rawValue
            )
        }
    
    }//end extension String
  7. 1
    NSString *str = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                 NULL,
                                 (CFStringRef)yourString, 
                                 NULL, 
                                 CFSTR("/:"), 
                                 kCFStringEncodingUTF8);

    Es necesario liberar o grupo de liberación automática str ti mismo.

  8. 0

    Google implementa esto en su Caja de herramientas de Google para Mac. Así que es un buen lugar para el pico de cómo lo están haciendo. Otra opción es incluir la caja de herramientas y su aplicación.

    Checkout de la aplicación aquí. (Que viene a ser exactamente lo que la gente ha estado publicando aquí).

  9. 0

    Esta es la forma en que yo estoy haciendo esto en swift.

    extension String {
        func encodeURIComponent() -> String {
            return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
        }
    
        func decodeURIComponent() -> String {
            return self.componentsSeparatedByString("+").joinWithSeparator(" ").stringByRemovingPercentEncoding!
        }
    }
  10. 0

    Aquí es lo que yo uso. Nota debe usar la @autoreleasepool la función o el programa podría accidente o bloqueo de la IDE. Tuve que reiniciar mi IDE tres veces hasta que me di cuenta de la corrección. Parece que este código es compatible con ARC.

    Esta pregunta se ha hecho muchas veces, y muchas de las respuestas dadas, pero, lamentablemente, todos los seleccionados (y algunos otros han sugerido), están equivocados.

    Aquí está la cadena de prueba que he utilizado: This is my 123+ test & test2. Got it?!

    Estos son mi Objetivo C++ métodos de la clase:

    static NSString * urlDecode(NSString *stringToDecode) {
        NSString *result = [stringToDecode stringByReplacingOccurrencesOfString:@"+" withString:@" "];
        result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        return result;
    }
    
    static NSString * urlEncode(NSString *stringToEncode) {
        @autoreleasepool {
            NSString *result = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
                    NULL,
                    (CFStringRef)stringToEncode,
                    NULL,
                    (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                    kCFStringEncodingUTF8
                ));
            result = [result stringByReplacingOccurrencesOfString:@"%20" withString:@"+"];
            return result;
        }
    }
  11. -1

    //uso NSString método de instancia como esta:

    + (NSString *)encodeURIComponent:(NSString *)string
    {
    NSString *s = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return s;
    }
    
    + (NSString *)decodeURIComponent:(NSString *)string
    {
    NSString *s = [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return s;
    }

    recuerde,usted sólo debe hacer codificar o decodificar por su valor de parámetro, no todas las url que usted solicite.

    • stringByReplacingPercentEscapeusingencoding: sólo escapa a & e = 🙁
    • Correcto, así que cosas como + no están codificados, cuando se necesita. Por lo tanto, no utilice la respuesta anterior
  12. -8
    int strLength = 0;
    NSString *urlStr = @"http://www";
    NSLog(@" urlStr : %@", urlStr );
    NSMutableString *mutableUrlStr = [urlStr mutableCopy];
    NSLog(@" mutableUrlStr : %@", mutableUrlStr );
    strLength = [mutableUrlStr length];
    [mutableUrlStr replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
    NSLog(@" mutableUrlStr : %@", mutableUrlStr );
    strLength = [mutableUrlStr length];
    [mutableUrlStr replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
    NSLog(@" mutableUrlStr : %@", mutableUrlStr );

Dejar respuesta

Please enter your comment!
Please enter your name here