Szybki 3
W Swift 3 jest addingPercentEncoding
let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)
Wynik:
test% 2Ftest
Szybki 1
W iOS 7 i nowszych jest stringByAddingPercentEncodingWithAllowedCharacters
var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")
Wynik:
test% 2Ftest
Przydatne (odwrócone) zestawy znaków to:
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
Jeśli chcesz, aby inny zestaw znaków był wybierany, utwórz zestaw:
Przykład z dodanym znakiem „=”:
var originalString = "test/test=42"
var customAllowedSet = NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")
Wynik:
test% 2Ftest% 3D42
Przykład weryfikacji znaków ascii spoza zestawu:
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()
nie pozostawia wątpliwości co do tego, co robi. Interesujący komentarz, biorąc pod uwagę, jak długie jest słowo „oszołomiony”.&
do zestawu znakówURLQueryAllowedCharacterSet
i każdy kod został zakodowany. Sprawdzone na iOS 9, wygląda na buggy, poszedłem z odpowiedzią @ bryanchen, działa dobrze !!URLComponents
iURLQueryItem
jest o wiele czystsza.Możesz użyć URLComponents, aby uniknąć konieczności ręcznego procentowego kodowania ciągu zapytania:
źródło
URLQueryItem
nie zawsze koduje się poprawnie. Na przykładFormula+One
zostanie zakodowany doFormula+One
, który zostałby zdekodowanyFormula One
. Dlatego bądź ostrożny ze znakiem plus.Swift 3:
1. kodowanie Pytanie:
wynik:
2. kodowanieURL:
wynik:
źródło
urlHostAllowed
do kodowania parametrów zapytania jest niepoprawne, ponieważ nie koduje?
,=
oraz+
. Podczas kodowania parametrów zapytania musisz osobno i poprawnie zakodować nazwę i wartość parametru. To nie zadziała w ogólnym przypadku.urlHostAllowed
URLComponents
.+
znaku. Tak więc jedyną opcją jest zrobienie tego ręcznie:CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "+"))
Swift 3:
źródło
Szybki 4
Aby zakodować parametr w adresie URL, znajduję użycie
.alphanumerics
zestawu znaków najłatwiejszej opcji:Korzystanie ze standardowych zestawów znaków do kodowania adresów URL (takich jak
URLQueryAllowedCharacterSet
lubURLHostAllowedCharacterSet
) nie będzie działać, ponieważ nie wykluczają=
ani&
znaków.Uwaga , że używając
.alphanumerics
go zakoduje pewne znaki, które nie muszą być zakodowane (jak-
,.
,_
lub~
- patrz 2.3 znaki bezwarunkowe. W dokumencie RFC 3986). Uważam, że używanie jest.alphanumerics
prostsze niż tworzenie niestandardowego zestawu znaków i nie przeszkadzają mi dodatkowe znaki do zakodowania. Jeśli Ci to przeszkadza, stwórz własny zestaw znaków, jak opisano w Jak procent kodować ciąg adresu URL , na przykład:Ostrzeżenie:
encoded
parametr jest siła rozpakowany. Niepoprawny ciąg znaków Unicode może ulec awarii. Zobacz Dlaczego wartość zwracana przez String.addingPercentEncoding () jest opcjonalna? . Zamiast wymuszać rozpakowywanieencoded!
, możesz użyćencoded ?? ""
lub użyćif let encoded = ...
.źródło
Wszystko jest takie samo
źródło
.bridgeToOvjectiveC()
podałeś drugiego argumentu i nie dostałeś „Nie można przekonwertować typu wyrażenia„ CFString! ” wpisać „CFString!” ”?Swift 4:
Zależy to od reguł kodowania stosowanych przez serwer.
Apple oferuje tę klasę metody, ale nie zgłasza, jakiego rodzaju protokołu RCF używa.
Postępując zgodnie z tym przydatnym narzędziem , powinieneś zagwarantować kodowanie tych znaków dla swoich parametrów:
Innymi słowy, mówiąc o kodowaniu adresów URL, powinieneś postępować zgodnie z protokołem RFC 1738 .
Swift nie obejmuje na przykład kodowania znaku + , ale działa dobrze z tymi trzema @:? znaki
Tak więc, aby poprawnie zakodować każdy parametr,
.urlHostAllowed
opcja nie jest wystarczająca, należy również dodać znaki specjalne, jak na przykład:Mam nadzieję, że to pomoże komuś, kto oszalał, przeszukać te informacje.
źródło
Swift 4 (nie testowany - skomentuj, czy działa, czy nie. Dziękujemy @ sumizome za sugestię)
Szybki 3
Swift 2.2 (Pożyczanie od Zapha i poprawianie klucza kwerendy adresu URL i wartości parametrów)
Przykład:
To jest krótsza wersja odpowiedzi Bryana Chena. Wydaje mi się, że
urlQueryAllowed
pozwala to na kontrolowanie znaków, o ile nie stanowią one części klucza lub wartości w ciągu zapytania, w którym to momencie trzeba ich uciec.źródło
var
), a następnie wywołać.remove
ją w drugim kroku.Szybki 4.2
Szybkie rozwiązanie dla jednej linii. Zastąp
originalString
ciągiem, który chcesz zakodować.Demo placu zabaw online
źródło
Sam tego potrzebowałem, więc napisałem rozszerzenie String, które pozwala zarówno na łańcuchy URLEncoding, jak i na bardziej powszechny cel końcowy, konwersję słownika parametrów na adres URL w stylu „GET” Parametry:
Cieszyć się!
źródło
&
ani=
parametrów. Zamiast tego sprawdź moje rozwiązanie.Ten działa dla mnie.
Znalazłem powyższą funkcję z tego linku: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/ .
źródło
let Url = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")
źródło
SWIFT 4.2
Czasami dzieje się tak tylko dlatego, że jest miejsce w ślimaku LUB brak kodowania adresu URL dla parametrów przechodzących przez adres URL interfejsu API.
UWAGA: Nie zapomnij o zbadaniu
bitmapRepresentation
.źródło
To działa dla mnie w Swift 5 . Przypadek użycia polega na pobieraniu adresu URL ze schowka lub podobnego, który mógł już mieć znaki ucieczki, ale który zawiera także znaki Unicode, które mogą powodować
URLComponents
lubURL(string:)
nie działać.Najpierw utwórz zestaw znaków zawierający wszystkie znaki zgodne z adresem URL:
Następnie rozszerz
String
metodę kodowania adresów URL:Które można przetestować jak:
Wartość
url
na końcu: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
Zauważ, że zachowane są oba znaki
%20
i+
odstępy, znaki Unicode są kodowane,%20
oryginałurlText
nie jest podwójnie kodowany, a kotwica (fragment lub#
) pozostaje.Edycja: teraz sprawdzanie ważności każdego komponentu.
źródło
Dla Swift 5 do końca łańcucha znaków
Jak używać ?
źródło
Żadna z tych odpowiedzi nie działała dla mnie. Nasza aplikacja ulegała awarii, gdy adres URL zawierał znaki inne niż angielskie.
W zależności od parametrów tego, co próbujesz zrobić, możesz po prostu stworzyć własny zestaw znaków. Powyższe pozwala na angielskie znaki i
-._~/?%$!:
źródło