Swift - encoder l'URL
Si j'encode une chaîne comme celle-ci:
var escapedString = originalString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
il n'échappe pas à les barres obliques /
.
J'ai cherché et trouvé cette Objective-C code:
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8 );
Est-il un moyen plus facile de coder une URL et si non, comment dois-je écrire dans cet Swift?
Vous devez vous connecter pour publier un commentaire.
Swift 3
Dans Swift 3 il est
addingPercentEncoding
De sortie:
Swift 1
Dans iOS 7 et ci-dessus, il est
stringByAddingPercentEncodingWithAllowedCharacters
De sortie:
Suivantes sont utiles (inversé) jeux de caractères:
Si vous voulez un jeu de caractères différent pour être échappé de créer un jeu:
Exemple avec ajout de caractère"=":
De sortie:
Exemple, pour vérifier les caractères ascii sont pas dans le jeu:
stringByAddingPercentEncodingWithAllowedCharacters()
laisse peu de doute sur ce qu'il fait. Commentaire intéressant compte tenu de combien de temps le mot: "sidéré" est.customAllowedSet
exemple.&
?charactersInString:
pour créer un jeu de caractères personnalisée.&
du jeu de caractères deURLQueryAllowedCharacterSet
et j'ai obtenu à chaque caractère codé. Vérifié avec iOS 9, ressemble buggy, je suis allé avec @bryanchen réponse, il fonctionne bien !!!
et quelques autres chacacters... pourquoi?customAllowedSet
.URLComponents
etURLQueryItem
est beaucoup plus propre de l'OMI.CharacterSet(charactersIn: "=&").inverted
Merci @zaphVous pouvez utiliser URLComponents pour éviter d'avoir à manuellement pour cent échapper à votre chaîne de requête:
URLQueryItem
n'est pas toujours coder correctement. Par exemple,Formula+One
serait encodée àFormula+One
, qui serait décodé pourFormula One
. Donc d'être prudent avec le signe plus.Swift 3:
Swift 3:
1. encodingQuery:
résultat:
2. encodingURL:
résultat:
urlHostAllowed
pour l'encodage des paramètres de requête incorrecte car il ne sera pas coder?
,=
et+
. Lors de l'encodage des paramètres de requête, vous devez coder nom du paramètre et la valeur séparément et correctement. Cela ne fonctionnera pas dans un cas général.urlHostAllowed
URLComponents
.Swift 4
Pour encoder un paramètre dans l'URL-je trouver de l'aide
.alphanumerics
jeu de caractères de l'option la plus facile:Aide de l'un des Jeux de Caractères standard de Codage d'URL (comme
URLQueryAllowedCharacterSet
ouURLHostAllowedCharacterSet
) ne fonctionnera pas, parce qu'ils n'excluent pas=
ou&
caractères.Note qu'en utilisant
.alphanumerics
il va encoder des caractères qui ne doivent pas être codés (comme-
,.
,_
ou~
-- voir 2.3. Sans réserve caractères dans la RFC 3986). - Je trouver de l'aide.alphanumerics
plus simple que la construction d'un jeu de caractères personnalisée et n'ont pas l'esprit de certains, d'autres caractères à encoder. Si cela vous ennuie, la construction d'un jeu de caractères personnalisée, comme il est décrit dans Comment pour cent encoder une Chaîne d'URL, comme par exemple:Avertissement: La
encoded
paramètre est la force déballé. Pour les invalides de chaîne unicode, il peut se bloquer. Voir Pourquoi la valeur de retour de la Chaîne.addingPercentEncoding (optionnelle)?. Au lieu de la force d'ôterencoded!
vous pouvez utiliserencoded ?? ""
ou de l'utilisationif let encoded = ...
.Tout est même
.bridgeToOvjectiveC()
deuxième argument et ne suis pas "Ne peut pas convertir l'expression est de type 'CFString!' de type 'CFString!'" ?Swift 4 (non testé - s'il vous plaît commentaire si ça fonctionne ou pas. Merci @sumizome pour la suggestion)
Swift 3
Swift 2.2 (Emprunt de Zaph et la correction de l'url de la requête de la clé et les valeurs de paramètre)
Exemple:
C'est une version plus courte de Bryan Chen réponse. Je suppose que
urlQueryAllowed
est de permettre les caractères de contrôle par le biais de ce qui est bien, sauf s'ils font partie de la clé ou de la valeur dans votre chaîne de requête à quel point ils doivent être échappés.var
) et ensuite appeler.remove
sur elle dans une deuxième étape.Swift 4:
Il dépend par les règles de codage suivie par votre serveur.
Apple offre cette méthode de classe, mais ce n'est pas un rapport qui sorte de RCF protocole, il suit.
La suite de cette utile outil vous devez garantir l'encodage de ces caractères pour vos paramètres:
En d'autres termes, parler de l'encodage de l'URL, vous devrait à la suite de la RFC 1738 protocole.
Et Swift ne couvrent pas l'encodage de l' + char par exemple, mais il fonctionne très bien avec ces trois @ : ? caractères.
Donc, pour correctement l'encodage de chaque paramètre , la
.urlHostAllowed
option n'est pas assez, vous devriez aussi ajouter des caractères spéciaux comme par exemple:Espère que cela aide quelqu'un qui devient fou à la recherche de ces informations.
Avait besoin de moi-même, j'ai donc écrit une Chaîne d'extension qui à la fois permet l'Encodage des chaînes, ainsi que le plus commun de l'objectif final, la conversion d'un paramètre dictionnaire en "GET" style de Paramètres d'URL:
Profitez-en!
&
ou=
dans les paramètres. De vérifier ma solution à la place.C'est de travailler pour moi.
Je l'ai trouvé au-dessus de la fonction à partir de ce lien: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/.
Swift 4.2
Un rapide d'une solution en ligne. Remplacer
originalString
avec la Chaîne que vous souhaitez encoder.Espace De Jeu En Ligne De La Démo
SWIFT 4.2
Parfois ce qui s'est passé juste parce qu'il y a de l'espace dans slug OU de l'absence de codage d'URL pour les paramètres en passant par l'API URL.
REMARQUE : N'oubliez pas de découvrir à propos de
bitmapRepresentation
.C'est de travailler pour moi en Swift 5. Le cas d'utilisation est de prendre une URL dans le presse-papiers ou similaires, qui peuvent déjà avoir des caractères d'échappement, mais qui contient également des caractères Unicode qui pourrait provoquer des
URLComponents
ouURL(string:)
à l'échec.Tout d'abord, créez un jeu de caractères qui comprend toutes les URL des caractères autorisés:
Ensuite, étendre
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
Noter que les deux
%20
et+
espacement sont préservés, des caractères Unicode codés, le%20
dans l'originalurlText
n'est pas double codé, et l'ancre (fragment, ou#
) reste.Edit: Maintenant la vérification de validité de chaque composant.
let Url = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")