141 votes

Le codage url objective-C

J’ai un NSString comme ceci :

mais je veux le transformer à :

Comment est-ce que je peux faire cela ?

333voto

Zaph Points 40557

Pour échapper les caractères que vous voulez, c'est un peu plus de travail.

Exemple de code (iOS7 et ci-dessus):

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

NSLog de sortie:

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

Les éléments suivants sont utiles codage d'URL jeux de caractères:

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

Pour Swift:

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

Pré iOS7 utilisation de Base de la Fondation
L'aide de Base de la Fondation ARC:

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

L'aide de Base de la Fondation, Sans ARC:

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

Remarque: -stringByAddingPercentEscapesUsingEncoding ne produira pas de l'encodage correct, dans ce cas, il ne codent rien de revenir sur la même chaîne.

stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding code 14 characrters:

`#%^{}[]|\"<> en plus de l'espace de caractère en pourcentage échappé.

chaîne de test:

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

encodedString:

"%20%60~!@%23$%25%5E&*()_+-=%7B%7D%5B%5D%7C%5C:;%22'%3C,%3E.?/AZaz"  

Remarque: si cet ensemble de caractères répondre à vos besoins, si pas les modifier selon les besoins.

RFC 3986 de caractères nécessitant l'encodage (% ajouté, car il est le codage de caractère de préfixe):

"!#$&'()*+,/:;=?@[]%"

Certains "sans réserve des personnages" sont en outre codé:

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

24voto

larsacus Points 4024

C'est ce qu'on appelle un encodage d'URL . Plus ici

 -(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
    return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
           (CFStringRef)self,
           NULL,
           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
           CFStringConvertNSStringEncodingToEncoding(encoding));
}
 

7voto

Anonymous White Points 926

Ce n'est pas ma solution. Quelqu'un d'autre a écrit dans stackoverflow mais j'ai oublié comment le faire.

De toute façon cette solution fonctionne "bien". Il gère diacritiques, les caractères chinois, et à peu près rien d'autre.

- (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 quelqu'un pourrait me dire qui a écrit ce code, je vais vraiment l'apprécier. Fondamentalement, il a une certaine explication de cette chaîne codée décoder exactement comme il le souhaite.

J'ai modifié sa solution un peu. J'aime l'espace pour être représenté avec des %20 plutôt que de +. C'est tout.

4voto

Zahi Points 11
 NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NUL,(CFStringRef)@"parameter",NULL,(CFStringRef)@"!*'();@&+$,/?%#[]~=_-.:",kCFStringEncodingUTF8 );

NSURL * url = [[NSURL alloc] initWithString:[@"address here" stringByAppendingFormat:@"?cid=%@",encodedString, nil]];

1voto

Wevah Points 17636

NSString *str = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)yourString, NULL, CFSTR("/:"), kCFStringEncodingUTF8);

Vous devrez libérer ou autorelease str vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X