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
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.
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.
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 "#%/:<>?@[\]^`
Objectif c
ce code fonctionne pour moi:
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
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;
}
}
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)
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
Où xxxxx
est une URL entièrement codée.
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!