web-dev-qa-db-fra.com

Remplacement pour stringByAddingPercentEscapesUtilisation du codage dans iOS 9?

Dans iOS8 et les versions antérieures, je peux utiliser:

NSString *str = ...; // some URL
NSString *result = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

dans iOS9 stringByAddingPercentEscapesUsingEncoding a été remplacé par stringByAddingPercentEncodingWithAllowedCharacters:

NSString *str = ...; // some URL
NSCharacterSet *set = ???; // where to find set for NSUTF8StringEncoding?
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];

et ma question est: où trouver NSCharacterSet nécessaire (NSUTF8StringEncoding) pour un remplacement correct de stringByAddingPercentEscapesUsingEncoding

99
slavik

Le message de dépréciation dit (souligné par moi):

Utilisez stringByAddingPercentEncodingWithAllowedCharacters (_ :) à la place, qui utilise toujours le codage UTF-8 recommandé , et qui code pour un composant ou sous-composant URL spécifique, car chaque composant ou sous-composant URL a des règles différentes pour les caractères valides.

Il vous suffit donc de fournir un argument NSCharacterSet adéquat. Heureusement, pour les URL, il existe une méthode de classe très pratique appelée URLHostAllowedCharacterSet que vous pouvez utiliser comme ceci:

let encodedHost = unencodedHost.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())

Mise à jour pour Swift 3 - la méthode devient la propriété statique urlHostAllowed:

let encodedHost = unencodedHost.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

Sachez cependant que:

Cette méthode est destinée à coder en pourcentage un composant d'URL ou une chaîne de sous-composant, PAS une chaîne d'URL complète.

125
Antonio Favata

Pour Objective-C:

NSString *str = ...; // some URL
NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];

où trouver set pour NSUTF8StringEncoding? 

Il existe des jeux de caractères prédéfinis pour les six composants et sous-composants URL qui autorisent le codage en pourcentage. Ces jeux de caractères sont passés à -stringByAddingPercentEncodingWithAllowedCharacters:.

 // Predefined character sets for the six URL components and subcomponents which allow percent encoding. These character sets are passed to -stringByAddingPercentEncodingWithAllowedCharacters:.
@interface NSCharacterSet (NSURLUtilities)
+ (NSCharacterSet *)URLUserAllowedCharacterSet;
+ (NSCharacterSet *)URLPasswordAllowedCharacterSet;
+ (NSCharacterSet *)URLHostAllowedCharacterSet;
+ (NSCharacterSet *)URLPathAllowedCharacterSet;
+ (NSCharacterSet *)URLQueryAllowedCharacterSet;
+ (NSCharacterSet *)URLFragmentAllowedCharacterSet;
@end

Le message de dépréciation dit (souligné par moi):

Utilisez stringByAddingPercentEncodingWithAllowedCharacters (_ :) à la place, qui utilise toujours le codage UTF-8 recommandé , et qui code pour un composant ou sous-composant URL spécifique, car chaque composant ou sous-composant URL a des règles différentes pour les caractères valides.

Il vous suffit donc de fournir un argument NSCharacterSet adéquat. Heureusement, pour les URL, il existe une méthode de classe très pratique appelée URLHostAllowedCharacterSet que vous pouvez utiliser comme ceci:

NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 

Sachez cependant que:

Cette méthode est destinée à coder en pourcentage un composant d'URL ou une chaîne de sous-composant, PAS une chaîne d'URL complète.

92
ElonChan

URLHostAllowedCharacterSet est NE FONCTIONNE PAS POUR MOI. J'utilise URLFragmentAllowedCharacterSet à la place. 

OBJECTIF C

NSCharacterSet *set = [NSCharacterSet URLFragmentAllowedCharacterSet];
NSString * encodedString = [@"url string" stringByAddingPercentEncodingWithAllowedCharacters:set];

Swift - 4

"url string".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

Voici des jeux de caractères utiles (inversés):

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

Objectif c

ce code fonctionne pour moi:

urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
21
Bilal L

Swift 2.2:

extension String {
 func encodeUTF8() -> String? {
//If I can create an NSURL out of the string nothing is wrong with it
if let _ = NSURL(string: self) {

    return self
}

//Get the last component from the string this will return subSequence
let optionalLastComponent = self.characters.split { $0 == "/" }.last


if let lastComponent = optionalLastComponent {

    //Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String
    let lastComponentAsString = lastComponent.map { String($0) }.reduce("", combine: +)


    //Get the range of the last component
    if let rangeOfLastComponent = self.rangeOfString(lastComponentAsString) {
        //Get the string without its last component
        let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)


        //Encode the last component
        if let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()) {


        //Finally append the original string (without its last component) to the encoded part (encoded last component)
        let encodedString = stringWithoutLastComponent + lastComponentEncoded

            //Return the string (original string/encoded string)
            return encodedString
        }
    }
}

return nil;
}
}
4
Bobj-C

Pour Swift 3.0

Vous pouvez utiliser urlHostAllowed characterSet.

/// Renvoie le jeu de caractères autorisé pour les sous-composants de l'URL de l'hôte.

public static var urlHostAllowed: CharacterSet { get }

WebserviceCalls.getParamValueStringForURLFromDictionary(settingsDict as! Dictionary<String, AnyObject>).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)
2
technerd

Quelle est la signification de "Cette méthode est destinée à coder en pourcentage un composant d'URL ou une chaîne de sous-composant, PAS une chaîne d'URL complète." ? - GeneCode 1 sep16 à 8h30 

Cela signifie que vous n'êtes pas censé encoder le https://xpto.example.com/path/subpath de l'URL, mais uniquement ce qui suit le ?.

Supposé, car il existe des cas d'utilisation pour le faire dans des cas tels que:

https://example.com?redirectme=xxxxx

xxxxx est une URL entièrement codée.

1
kindaian

Ajout à la réponse acceptée . Compte tenu de cette note

Cette méthode est destinée à coder en pourcentage un composant d'URL ou une chaîne de sous-composant, PAS une chaîne d'URL complète.

l'URL entière ne doit pas être encodée:

let param = "=color:green|\(latitude),\(longitude)&\("zoom=13&size=\(width)x\(height)")&sensor=true&key=\(staticMapKey)".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) 
let url = "https://maps.google.com/maps/api/staticmap?markers" + param!
0
Ayman Ibrahim