web-dev-qa-db-fra.com

NSString URL decode?

J'ai essayé beaucoup d'approches là-bas, mais cette minuscule chaîne ne peut tout simplement pas être décodée par une URL.

NSString *decoded;
NSString *encoded = @"fields=ID%2CdeviceToken";
decoded = (__bridge NSString*)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)encoded, NULL, NSUTF8StringEncoding);
NSLog(@"decodedString %@", decoded);

Le code ci-dessus enregistre simplement la même chaîne (!) Après avoir remplacé le pourcentage d'évasions.

Existe-t-il une solution fiable? Je pense qu'une solution RegEx basée sur une documentation pourrait fonctionner. Toute suggestion?

17
Geri

Utilisez CFSTR("") au lieu de NULL pour l'avant-dernier argument. De la référence CFURL :

personnagesToLeaveEscaped

Caractères dont vous souhaitez conserver les séquences d'échappement en pourcentage, telles que% 20 pour un caractère d'espacement. Passez NULL pour spécifier qu'aucun pourcentage d'échappement ne doit être remplacé ou la chaîne vide (CFSTR ("")) pour spécifier que tous doivent être remplacés.

    NSString *encoded = @"fields=ID%2CdeviceToken";
    NSString *decoded = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)encoded, CFSTR(""), kCFStringEncodingUTF8);
    NSLog(@"decodedString %@", decoded);

Impressions:

2013-03-26 21: 48: 52.559 URLDecoding [28794: 303] decodedString fields = ID, deviceToken

17
Carl Veazey

Une autre option serait:

NSString *decoded = [encoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
32
rmaddy

CFURLCreateStringByReplacingPercentEscapesUsingEncoding est obsolète dans iOS 9. Utilisez plutôt stringByRemovingPercentEncoding .

NSString *decoded = [encoded stringByRemovingPercentEncoding];
14
Mohammed Afsul

Swift 3

import Foundation

let charSet = CharacterSet.urlPathAllowed.union(.urlQueryAllowed) // just use what you need, either path or query
let enc = "Test Test Test".addingPercentEncoding(withAllowedCharacters: charSet)!
let dec = enc.removingPercentEncoding!

print("Encoded: \(enc)")
print("Decoded: \(dec)")

Sortie:

Encodé: Test% 20Test% 20Test

Décodé: Test Test Test

1
hashier