J'ai une chaîne URL ( NSString) avec des espaces et des &caractères. Comment encoder l'URL de la chaîne entière (y compris l' &esperluette et les espaces)?
Malheureusement, stringByAddingPercentEscapesUsingEncodingcela ne fonctionne pas toujours à 100%. Il encode les caractères non URL mais laisse les caractères réservés (comme la barre oblique /et l'esperluette &) seuls. Apparemment, c'est un bogue dont Apple est conscient, mais comme ils ne l'ont pas encore corrigé, j'utilise cette catégorie pour encoder une chaîne en url:
Pourquoi diable utiliseriez-vous une catégorie compliquée comme celle-ci plutôt que de simplement passer à CFURLCreateStringByAddingPercentEscapes () , où vous pouvez spécifier explicitement les caractères que vous voulez toujours échapper.
Lily Ballard
8
@KevinBallard car la fonction CF fonctionne sur un modèle inclusif ("échapper à ces caractères"), et généralement vous voulez travailler sur un modèle exclusif ("échapper à tout sauf ces caractères")
@DaveDeLong C'est peut-être là que je l'ai eu. C'est une catégorie standard dans tous mes projets depuis environ un an, alors j'imagine que vous en avez peut-être été la source originale! J'ai édité le libellé donc il ne semble pas que j'essaie de m'attribuer le mérite de l'avoir écrit).
chown
4
Pourquoi? if (thisChar == '') {[output appendString: @ "+"]; } Sans cela, s'il encodera les espaces avec% 20 comme je m'y attendais
Cela n'encode pas non plus correctement les délimiteurs de paramètres tels que «&», «?» dans le cas où vous transmettez du contenu dans une API.
Ben Lachman
«&» n'est pas un caractère valide pour le paramètre de chaîne de requête URL. Veuillez essayer d'utiliser «& amp;» au lieu.
Nishant le
1
stringByAddingPercentEscapesUsingEncoding is DEPRECATED "À utiliser à la -stringByAddingPercentEncodingWithAllowedCharacters: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."
Mihir Oza
89
De nouvelles API ont été ajoutées depuis que la réponse a été sélectionnée; Vous pouvez maintenant utiliser NSURLUtilities. Étant donné que différentes parties des URL autorisent différents caractères, utilisez le jeu de caractères applicable. L'exemple suivant code pour l'inclusion dans la chaîne de requête:
Pour convertir spécifiquement «&», vous devez le supprimer de l'ensemble de requêtes URL ou utiliser un ensemble différent, car «&» est autorisé dans une requête URL:
Il m'a fallu un certain temps pour comprendre ce que vous vouliez dire par «utiliser NSURLUtilities» - mais maintenant je vois que c'est le nom de la catégorie de NSString dans laquelle Apple a défini cette nouvelle méthode dans iOS 7 et OS X 10.9.
Ouaip. Il a également été répertorié comme NSURLUtilities dans la liste des nouvelles API publiées.
Peter DeWeese
'&' est bien sûr autorisé dans une chaîne de requête, je vais donc modifier ma réponse en utilisant le lien de Richard.
Peter DeWeese
3
NSMakeRange('&', 1)ne fonctionne pas dans Swift, car Swift n'autorise pas la conversion de caractères en int sans hacks. Pour utiliser cette solution en code Swift, utilisez à la removeCharactersInString("&")place de.removeCharactersInRange(...)
cbh2000
16
Exemple de Swift 2.0 (compatible avec iOS 9)
extension String{
func stringByURLEncoding()->String?{
let characters =NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as!NSMutableCharacterSet
characters.removeCharactersInString("&")
guard let encodedString = self.stringByAddingPercentEncodingWithAllowedCharacters(characters)else{return nil
}return encodedString
}}
Cela dépend en fait de votre serveur pour les caractères autorisés, ici, sur mon exemple sur le serveur que je l'utilisais, il ne permettait que le jeu de caractères alphanumériques autorisé, vous pouvez le changer en caractères spécifiques pour répondre à vos besoins.
Underdog
1
La question porte sur l'encodage du caractère «&».
Steve Moser
8
J'ai choisi d'utiliser l' CFURLCreateStringByAddingPercentEscapesappel tel que donné par la réponse acceptée, mais dans la dernière version de XCode (et IOS), cela a entraîné une erreur, j'ai donc utilisé ce qui suit à la place:
Ce n'est pas de l'espace d'encodage. Exemple @ "string string" et @ "string & string" sont codés correctement. S'il vous plaît laissez-moi savoir votre avis sur le même.
Yogesh Lolusare
2
pour moi, la plupart du temps passé à résoudre ce problème a été la période de refus où j'ai refusé de croire que le cadre ne contenait pas quelque chose de nommé similaire à 'urlencode' qui le fait sans déconner ..
dancl
6
Essayez d'utiliser la stringByAddingPercentEncodingWithAllowedCharactersméthode avec [NSCharacterSet URLUserAllowedCharacterSet]elle couvrira tous les cas
Objectif c
NSString*value =@"Test / Test";
value =[value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetURLUserAllowedCharacterSet]];
rapide
var value ="Test / Test"
value.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLUserAllowedCharacterSet())
Après avoir lu toutes les réponses à ce sujet et la ( mauvaise ) acceptée, je veux ajouter ma contribution.
SI la cible est iOS7 +, et en 2017, cela devrait, puisque XCode rend vraiment difficile la compatibilité sous iOS8, le meilleur moyen, sûr pour les threads, rapide, amd prendra entièrement en charge UTF-8 pour ce faire est:
(Code objectif C)
@implementationNSString(NSString_urlencoding)-(NSString*)urlencode {staticNSMutableCharacterSet*chars = nil;staticdispatch_once_t pred;if(chars)return[self stringByAddingPercentEncodingWithAllowedCharacters:chars];// to be thread safe
dispatch_once(&pred,^{
chars =NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;[chars removeCharactersInString:@"!*'();:@&=+$,/?%#[]"];});return[self stringByAddingPercentEncodingWithAllowedCharacters:chars];}@end
Cela étendra NSString, exclura les caractères interdits RFC, prendra en charge les caractères UTF-8 et vous permettra d'utiliser des choses comme:
let stringURL ="YOUR URL TO BE ENCODE";
let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
print(encodedURLString)
Depuis, stringByAddingPercentEscapesUsingEncodingencode les caractères non URL mais laisse les caractères réservés (comme !*'();:@&=+$,/?%#[]), vous pouvez encoder l'url comme le code suivant:
let stringURL ="YOUR URL TO BE ENCODE";
let characterSetTobeAllowed =(CharacterSet(charactersIn:"!*'();:@&=+$,/?%#[] ").inverted)if let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters: characterSetTobeAllowed){
print(encodedURLString)}
Le conseil d'Apple, dans les notes de version 10.11, est:
Si vous devez encoder en pourcentage une chaîne d'URL entière, vous pouvez utiliser ce code pour encoder une NSString destinée à être une URL (dans urlStringToEncode):
ne semble pas fonctionner, les personnages aiment et sont toujours laissés seuls
kjyv
1
Dans mon cas où le dernier composant était des lettres arabes, j'ai fait ce qui suit dans Swift 2.2:
extension String{
func encodeUTF8()->String?{//If I can create an NSURL out of the string nothing is wrong with itif 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 componentif let rangeOfLastComponent = self.rangeOfString(lastComponentAsString){//Get the string without its last component
let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)//Encode the last componentif 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;}}
usage:
let stringURL ="http://xxx.dev.com/endpoint/nonLatinCharacters"if let encodedStringURL = stringURL.encodeUTF8(){if let url = NSURL(string: encodedStringURL){...}}
Mais il est obsolète dans iOS 9. Quel est le code mis à jour pour cela?
Sujit Nachan
1
Tant de réponses mais cela n'a pas fonctionné pour moi, alors j'ai essayé ce qui suit:
fun simpleServiceCall(for serviceUrl:String, appendToUrl:String){
let urlString:String= serviceUrl + appendToUrl.addingPercentEncoding(withAllowedCharacters:.urlPathAllowed)!
let finalUrl = URL(string: urlString)!//continue to execute your service call... }
J'ai rencontré un problème similaire en passant des chaînes complexes en tant que paramètre POST. Mes chaînes peuvent contenir des caractères asiatiques, des espaces, des guillemets et toutes sortes de caractères spéciaux. La solution que j'ai finalement trouvée a été de convertir ma chaîne dans la série correspondante d'Unicodes, par exemple "Hu0040Hu0020Hu03f5 ...." en utilisant [NSString stringWithFormat: @ "Hu% 04x", [string characterAtIndex: i]] pour obtenir l'Unicode de chaque caractère dans la chaîne d'origine. La même chose peut être faite en Java.
Cette chaîne peut être transmise en toute sécurité en tant que paramètre POST.
Côté serveur (PHP), je change tous les "H" en "\" et je passe la chaîne résultante à json_decode. La dernière étape consiste à échapper les guillemets simples avant de stocker la chaîne dans MySQL.
De cette façon, je peux stocker n'importe quelle chaîne UTF8 sur mon serveur.
Réponses:
Malheureusement,
stringByAddingPercentEscapesUsingEncoding
cela ne fonctionne pas toujours à 100%. Il encode les caractères non URL mais laisse les caractères réservés (comme la barre oblique/
et l'esperluette&
) seuls. Apparemment, c'est un bogue dont Apple est conscient, mais comme ils ne l'ont pas encore corrigé, j'utilise cette catégorie pour encoder une chaîne en url:Utilisé comme ceci:
Cela fonctionne également:
Quelques bonnes lectures sur le sujet:
Objectif-c iPhone pour cent encoder une chaîne?
Encodage URL Objective-C et Swift
http://cybersam.com/programming/proper-url-percent-encoding-in-ios
https://devforums.apple.com/message/15674#15674 http://simonwoodside.com/weblog/2009/4/ 22 / how_to_really_url_encode /
la source
Cela pourrait être utile
Pour iOS 7+, la méthode recommandée est:
Vous pouvez choisir le jeu de caractères autorisé selon les exigences du composant URL.
la source
-stringByAddingPercentEncodingWithAllowedCharacters:
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."De nouvelles API ont été ajoutées depuis que la réponse a été sélectionnée; Vous pouvez maintenant utiliser NSURLUtilities. Étant donné que différentes parties des URL autorisent différents caractères, utilisez le jeu de caractères applicable. L'exemple suivant code pour l'inclusion dans la chaîne de requête:
Pour convertir spécifiquement «&», vous devez le supprimer de l'ensemble de requêtes URL ou utiliser un ensemble différent, car «&» est autorisé dans une requête URL:
la source
NSMakeRange('&', 1)
ne fonctionne pas dans Swift, car Swift n'autorise pas la conversion de caractères en int sans hacks. Pour utiliser cette solution en code Swift, utilisez à laremoveCharactersInString("&")
place de.removeCharactersInRange(...)
Exemple de Swift 2.0 (compatible avec iOS 9)
la source
mise à jour ios 7
la source
J'ai choisi d'utiliser l'
CFURLCreateStringByAddingPercentEscapes
appel tel que donné par la réponse acceptée, mais dans la dernière version de XCode (et IOS), cela a entraîné une erreur, j'ai donc utilisé ce qui suit à la place:la source
Essayez d'utiliser la
stringByAddingPercentEncodingWithAllowedCharacters
méthode avec[NSCharacterSet URLUserAllowedCharacterSet]
elle couvrira tous les casObjectif c
rapide
Production
Test%20%2F%20Test
la source
Après avoir lu toutes les réponses à ce sujet et la ( mauvaise ) acceptée, je veux ajouter ma contribution.
SI la cible est iOS7 +, et en 2017, cela devrait, puisque XCode rend vraiment difficile la compatibilité sous iOS8, le meilleur moyen, sûr pour les threads, rapide, amd prendra entièrement en charge UTF-8 pour ce faire est:
(Code objectif C)
Cela étendra NSString, exclura les caractères interdits RFC, prendra en charge les caractères UTF-8 et vous permettra d'utiliser des choses comme:
Cela s'imprimera sur votre console de débogage:
... notez également l'utilisation de dispatch_once pour éviter de multiples initialisations dans les environnements multithread.
la source
Voici une approche flexible prête pour la production dans Swift 5.x :
Exemple d'utilisation:
Production:
la source
Utilisez NSURLComponents pour coder les paramètres HTTP GET:
http://www.ralfebert.de/snippets/ios/encoding-nsurl-get-parameters/
la source
Ce code m'a aidé à encoder des caractères spéciaux
la source
code swift basé sur la réponse objc de chown dans ce fil.
la source
Dans Swift 3 , veuillez essayer ci-dessous:
Depuis,
stringByAddingPercentEscapesUsingEncoding
encode les caractères non URL mais laisse les caractères réservés (comme!*'();:@&=+$,/?%#[]
), vous pouvez encoder l'url comme le code suivant:la source
Dans Swift 3:
la source
Le conseil d'Apple, dans les notes de version 10.11, est:
Si vous devez encoder en pourcentage une chaîne d'URL entière, vous pouvez utiliser ce code pour encoder une NSString destinée à être une URL (dans urlStringToEncode):
la source
Dans mon cas où le dernier composant était des lettres arabes, j'ai fait ce qui suit dans
Swift 2.2
:usage:
la source
selon le blog suivant
la source
Tant de réponses mais cela n'a pas fonctionné pour moi, alors j'ai essayé ce qui suit:
J'espère que cela aidera quelqu'un. Merci
la source
Pour les paramètres de requête codés par formulaire www, j'ai créé une catégorie sur NSString:
la source
// Ceci est sans test
la source
J'ai rencontré un problème similaire en passant des chaînes complexes en tant que paramètre POST. Mes chaînes peuvent contenir des caractères asiatiques, des espaces, des guillemets et toutes sortes de caractères spéciaux. La solution que j'ai finalement trouvée a été de convertir ma chaîne dans la série correspondante d'Unicodes, par exemple "Hu0040Hu0020Hu03f5 ...." en utilisant [NSString stringWithFormat: @ "Hu% 04x", [string characterAtIndex: i]] pour obtenir l'Unicode de chaque caractère dans la chaîne d'origine. La même chose peut être faite en Java.
Cette chaîne peut être transmise en toute sécurité en tant que paramètre POST.
Côté serveur (PHP), je change tous les "H" en "\" et je passe la chaîne résultante à json_decode. La dernière étape consiste à échapper les guillemets simples avant de stocker la chaîne dans MySQL.
De cette façon, je peux stocker n'importe quelle chaîne UTF8 sur mon serveur.
la source
Celui-ci fonctionne pour moi.
J'ai trouvé la fonction ci-dessus à partir de ce lien: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/
Vous pouvez également utiliser cette fonction avec l'extension rapide. S'il vous plaît laissez-moi savoir s'il y a un problème.
la source