Swift 3
Dans Swift 3, il y a addingPercentEncoding
let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)
Production:
test% 2Ftest
Swift 1
Dans iOS 7 et supérieur, il y a stringByAddingPercentEncodingWithAllowedCharacters
var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")
Production:
test% 2Ftest
Les jeux de caractères suivants sont utiles (inversés):
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
Si vous souhaitez échapper un autre jeu de caractères, créez un jeu:
Exemple avec un caractère "=" ajouté:
var originalString = "test/test=42"
var customAllowedSet = NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")
Production:
test% 2Ftest% 3D42
Exemple de vérification des caractères ascii absents de l'ensemble:
func printCharactersInSet(set: NSCharacterSet) {
var characters = ""
let iSet = set.invertedSet
for i: UInt32 in 32..<127 {
let c = Character(UnicodeScalar(i))
if iSet.longCharacterIsMember(i) {
characters = characters + String(c)
}
}
print("characters not in set: \'\(characters)\'")
}
stringByAddingPercentEncodingWithAllowedCharacters()
laisse peu de doute sur ce qu'il fait. Commentaire intéressant compte tenu de la longueur du mot: "sidéré".&
au jeu de caractères deURLQueryAllowedCharacterSet
et j'ai obtenu chaque caractère encodé. Vérifié avec iOS 9, ressemble à un buggy, je suis allé avec la réponse de @ bryanchen, cela fonctionne bien !!URLComponents
etURLQueryItem
est beaucoup plus propre OMI.Vous pouvez utiliser URLComponents pour éviter d'avoir à encoder manuellement en pourcentage votre chaîne de requête:
la source
URLQueryItem
ne code pas toujours correctement. Par exemple,Formula+One
serait codé enFormula+One
, qui serait décodé enFormula One
. Soyez donc prudent avec le signe plus.Swift 3:
1. encodingQuery:
résultat:
2. encodingURL:
résultat:
la source
urlHostAllowed
pour le codage des paramètres de requête incorrecte car elle ne sera pas codée?
,=
et+
. Lors du codage de paramètres de requête, vous devez coder le nom et la valeur du paramètre séparément et correctement. Cela ne fonctionnera pas dans un cas général.urlHostAllowed
URLComponents
.+
aussi. La seule option est donc de le faire manuellement:CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "+"))
Swift 3:
la source
Swift 4
Pour encoder un paramètre dans l'URL, je trouve en utilisant le
.alphanumerics
jeu de caractères l'option la plus simple:L'utilisation de l'un des jeux de caractères standard pour le codage d'URL (comme
URLQueryAllowedCharacterSet
ouURLHostAllowedCharacterSet
) ne fonctionnera pas, car ils n'excluent pas=
ou les&
caractères.Notez qu'en utilisant
.alphanumerics
ce codent des caractères qui ne ont pas besoin d'être codées (comme-
,.
,_
ou~
- voir 2.3 caractères non réservés. Dans la RFC 3986). Je trouve l'utilisation.alphanumerics
plus simple que la construction d'un jeu de caractères personnalisé et cela ne me dérange pas que certains caractères supplémentaires soient encodés. Si cela vous dérange, créez un jeu de caractères personnalisé comme décrit dans Comment coder en pourcentage une chaîne d'URL , comme par exemple:Avertissement: le
encoded
paramètre est déplié de force. Pour une chaîne Unicode non valide, elle peut se bloquer. Voir Pourquoi la valeur de retour de String.addingPercentEncoding () est-elle facultative? . Au lieu de déballer de force,encoded!
vous pouvez utiliserencoded ?? ""
ou utiliserif let encoded = ...
.la source
Tout est pareil
la source
.bridgeToOvjectiveC()
secondé l'argument et vous n'avez pas obtenu "Impossible de convertir le type d'expression" CFString! " taper 'CFString!' "?Swift 4:
Cela dépend des règles d'encodage suivies par votre serveur.
Apple propose cette méthode de classe, mais elle ne signale pas quel type de protocole RCF elle suit.
En suivant cet outil utile , vous devez garantir le codage de ces caractères pour vos paramètres:
En d'autres termes, en parlant d'encodage d'URL, vous devez suivre le protocole RFC 1738 .
Et Swift ne couvre pas l'encodage du caractère + par exemple , mais cela fonctionne bien avec ces trois @:? caractères.
Donc, pour encoder correctement chacun de vos paramètres, l'
.urlHostAllowed
option ne suffit pas, vous devez également ajouter les caractères spéciaux comme par exemple:J'espère que cela aide quelqu'un qui devient fou à rechercher ces informations.
la source
Swift 4 (non testé - veuillez commenter si cela fonctionne ou non. Merci @sumizome pour la suggestion)
Swift 3
Swift 2.2 (Emprunt de Zaph et correction des valeurs de clé et de paramètre de requête d'URL)
Exemple:
Ceci est une version courte de la réponse de Bryan Chen. Je suppose que cela
urlQueryAllowed
permet aux caractères de contrôle de passer, à moins qu'ils ne fassent partie de la clé ou de la valeur de votre chaîne de requête à quel point ils doivent être échappés.la source
var
) et ensuite l'appeler.remove
dans une deuxième étape.Swift 4.2
Une solution rapide en ligne. Remplacez
originalString
par la chaîne que vous souhaitez encoder.Démo de Playground en ligne
la source
J'en avais besoin moi-même, j'ai donc écrit une extension de chaîne qui permet à la fois les chaînes URLEncoding, ainsi que l'objectif final le plus courant, la conversion d'un dictionnaire de paramètres en paramètres d'URL de style "GET":
Prendre plaisir!
la source
&
ou=
en paramètres. Vérifiez plutôt ma solution.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/ .
la source
let Url = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")
la source
SWIFT 4.2
Parfois, cela s'est produit simplement parce qu'il y a de l'espace dans la limace OU l'absence de codage d'URL pour les paramètres passant par l'URL de l'API.
REMARQUE: N'oubliez pas d'explorer
bitmapRepresentation
.la source
Cela fonctionne pour moi dans Swift 5 . Le cas d'utilisation prend une URL du presse-papiers ou similaire qui peut déjà avoir des caractères d'échappement mais qui contient également des caractères Unicode qui pourraient provoquer
URLComponents
ouURL(string:)
échouer.Tout d'abord, créez un jeu de caractères qui comprend tous les caractères autorisés par l'URL:
Ensuite, étendez
String
avec une méthode pour encoder les URL:Qui peut être testé comme:
Valeur de
url
à la fin:https://www.example.com/%ED%8F%B4%EB%8D%94/search?q=123&foo=bar&multi=eggs+and+ham&hangul=%ED%95%9C%EA%B8%80&spaced=lovely%20spam&illegal=%3C%3E#top
Notez que les deux
%20
et l'+
espacement sont préservés, les caractères Unicode sont codés, l'%20
originalurlText
n'est pas codé en double et l'ancre (fragment ou#
) reste.Edit: vérifie maintenant la validité de chaque composant.
la source
Pour Swift 5 à la chaîne de code de fin
Comment utiliser ?
la source
Aucune de ces réponses n'a fonctionné pour moi. Notre application se bloquait lorsqu'une URL contenait des caractères non anglais.
En fonction des paramètres de ce que vous essayez de faire, vous pouvez simplement créer votre propre jeu de caractères. Ce qui précède permet les caractères anglais, et
-._~/?%$!:
la source