Swift 3
In Swift 3 gibt es addingPercentEncoding
let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)
Ausgabe:
test% 2Ftest
Schnell 1
In iOS 7 und höher gibt es stringByAddingPercentEncodingWithAllowedCharacters
var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")
Ausgabe:
test% 2Ftest
Die folgenden nützlichen (invertierten) Zeichensätze sind:
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
Wenn Sie möchten, dass ein anderer Zeichensatz maskiert wird, erstellen Sie einen Satz:
Beispiel mit hinzugefügtem "=" - Zeichen:
var originalString = "test/test=42"
var customAllowedSet = NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")
Ausgabe:
test% 2Ftest% 3D42
Beispiel zum Überprüfen von ASCII-Zeichen, die nicht im Satz enthalten sind:
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()
lässt wenig Zweifel darüber, was es tut. Interessanter Kommentar, wenn man bedenkt, wie lange das Wort "verblüfft" ist.&
den Zeichensatz von hinzugefügtURLQueryAllowedCharacterSet
und jedes Zeichen codiert. Mit iOS 9 überprüft, sieht aus wie ein Buggy, ich habe mich für die Antwort von @ bryanchen entschieden, es funktioniert gut !!URLComponents
undURLQueryItem
ist viel sauberer IMO.Sie können URLComponents verwenden, um zu vermeiden, dass Sie Ihre Abfragezeichenfolge manuell prozentual codieren müssen:
quelle
URLQueryItem
kodiert nicht immer richtig. Zum BeispielFormula+One
würde codiert werdenFormula+One
, was decodiert würdeFormula One
. Seien Sie daher vorsichtig mit dem Pluszeichen.Swift 3:
1. encodingQuery:
Ergebnis:
2. encodingURL:
Ergebnis:
quelle
urlHostAllowed
für die Codierung von Abfrageparametern in falsch, weil es nicht codiert?
,=
und+
. Beim Codieren von Abfrageparametern müssen Sie Parametername und -wert separat und korrekt codieren. Dies funktioniert im Allgemeinen nicht.urlHostAllowed
URLComponents
.+
. Die einzige Möglichkeit besteht darin, dies manuell zu tun:CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "+"))
Swift 3:
quelle
Swift 4
Um einen Parameter in einer URL zu codieren, finde ich die Verwendung des
.alphanumerics
Zeichensatzes die einfachste Option:Unter Verwendung einer der Standardzeichensätze für URL - Kodierung (wie
URLQueryAllowedCharacterSet
oderURLHostAllowedCharacterSet
) wird nicht funktionieren, weil sie es nicht tun ausschließen=
oder&
Zeichen.Beachten Sie, dass durch die Verwendung
.alphanumerics
es einige Zeichen kodieren, die nicht brauchen codiert werden (wie-
,.
,_
oder~
- siehe 2.3 Unreserved Zeichen. In RFC 3986). Ich finde die Verwendung.alphanumerics
einfacher als das Erstellen eines benutzerdefinierten Zeichensatzes und habe nichts dagegen, einige zusätzliche Zeichen zu codieren. Wenn Sie das stört, erstellen Sie einen benutzerdefinierten Zeichensatz, wie unter So codieren Sie eine URL- Zeichenfolge in Prozent beschrieben , wie zum Beispiel:Warnung: Der
encoded
Parameter wird zwangsweise entpackt. Bei ungültigen Unicode-Zeichenfolgen kann es zum Absturz kommen. Siehe Warum ist der Rückgabewert von String.addingPercentEncoding () optional? . Anstatt das Auspacken zu erzwingenencoded!
, können Sie es verwendenencoded ?? ""
oder verwendenif let encoded = ...
.quelle
Alles ist gleich
quelle
.bridgeToOvjectiveC()
zweites Argument und nicht erhalten "Kann den Typ 'CFString!' Des Ausdrucks nicht konvertieren. um 'CFString!' "einzugeben?Swift 4:
Dies hängt von den Codierungsregeln ab, die von Ihrem Server befolgt werden.
Apple bietet diese Klassenmethode an, meldet jedoch nicht, welcher Art von RCF-Protokoll es folgt.
Wenn Sie diesem nützlichen Tool folgen, sollten Sie die Codierung dieser Zeichen für Ihre Parameter garantieren:
Mit anderen Worten, wenn Sie über die URL-Codierung sprechen, sollten Sie das RFC 1738-Protokoll befolgen .
Und Swift behandelt zum Beispiel nicht die Codierung des + Zeichens , aber es funktioniert gut mit diesen drei @ :? Zeichen.
Um jeden Ihrer Parameter korrekt zu codieren, reicht die
.urlHostAllowed
Option nicht aus. Sie sollten auch die Sonderzeichen hinzufügen, wie zum Beispiel:Hoffe, dies hilft jemandem, der verrückt wird, diese Informationen zu suchen.
quelle
Swift 4 (nicht getestet - bitte kommentieren Sie, ob es funktioniert oder nicht. Danke @sumizome für den Vorschlag)
Swift 3
Swift 2.2 (Ausleihen bei Zaph und Korrektur von URL-Abfrageschlüssel- und Parameterwerten)
Beispiel:
Dies ist eine kürzere Version von Bryan Chens Antwort. Ich würde vermuten,
urlQueryAllowed
dass dies die Steuerzeichen zulässt, durch die dies in Ordnung ist, es sei denn, sie sind Teil des Schlüssels oder Werts in Ihrer Abfragezeichenfolge. An diesem Punkt müssen sie maskiert werden.quelle
var
) und rufe.remove
es dann in einem zweiten Schritt auf.Swift 4.2
Eine schnelle einzeilige Lösung. Ersetzen Sie
originalString
durch den String, den Sie codieren möchten.Online-Spielplatz-Demo
quelle
Ich brauchte das selbst und schrieb eine String-Erweiterung, die sowohl URLEncoding-Strings als auch das häufigere Endziel ermöglicht, ein Parameterwörterbuch in URL-Parameter im "GET" -Stil zu konvertieren:
Genießen!
quelle
&
oder=
in Parametern. Überprüfen Sie stattdessen meine Lösung.Dieser arbeitet für mich.
Ich habe die obige Funktion über diesen Link gefunden: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/ .
quelle
let Url = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")
quelle
SWIFT 4.2
Manchmal geschah dies nur, weil im Slug ODER ohne URL-Codierung Platz für Parameter vorhanden ist, die über die API-URL übertragen werden.
HINWEIS: Vergessen Sie nicht, etwas zu erkunden
bitmapRepresentation
.quelle
Das funktioniert bei mir in Swift 5 . Der Anwendungsfall besteht darin, eine URL aus der Zwischenablage oder ähnlichem zu übernehmen, die möglicherweise bereits maskierte Zeichen enthält, aber auch Unicode-Zeichen enthält, die
URLComponents
oder verursachen könnenURL(string:)
fehlschlagen können.Erstellen Sie zunächst einen Zeichensatz, der alle URL-zulässigen Zeichen enthält:
Erweitern Sie
String
als Nächstes eine Methode zum Codieren von URLs:Welches kann getestet werden wie:
Wert von
url
am Ende: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
Beachten Sie, dass sowohl der Abstand
%20
als auch der+
Abstand erhalten bleiben, Unicode-Zeichen codiert werden, das%20
im OriginalurlText
nicht doppelt codiert ist und der Anker (Fragment oder#
) erhalten bleibt.Bearbeiten: Überprüfen Sie nun die Gültigkeit jeder Komponente.
quelle
Für Swift 5 zur Endcode-Zeichenfolge
Wie benutzt man ?
quelle
Keine dieser Antworten hat bei mir funktioniert. Unsere App stürzte ab, als eine URL nicht englische Zeichen enthielt.
Abhängig von den Parametern, die Sie ausführen möchten, möchten Sie möglicherweise nur Ihren eigenen Zeichensatz erstellen. Das obige erlaubt englische Zeichen und
-._~/?%$!:
quelle