Cepat 3
Di Swift 3 ada addingPercentEncoding
let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)
Keluaran:
test% 2Fest
Cepat 1
Di iOS 7 dan di atasnya ada stringByAddingPercentEncodingWithAllowedCharacters
var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")
Keluaran:
test% 2Fest
Berikut ini adalah rangkaian karakter yang berguna (terbalik):
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
Jika Anda ingin satu set karakter yang berbeda diloloskan, buat satu set:
Contoh dengan menambahkan "=" karakter:
var originalString = "test/test=42"
var customAllowedSet = NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")
Keluaran:
test% 2Test% 3D42
Contoh untuk memverifikasi karakter ascii tidak di set:
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()
meninggalkan sedikit keraguan tentang apa yang dilakukannya. Komentar menarik mengingat berapa lama kata: "terperangah" adalah.&
ke set karakterURLQueryAllowedCharacterSet
dan saya membuat setiap karakter dikodekan. Diperiksa dengan iOS 9, sepertinya buggy, saya menjawab dengan @ bryanchen, ia bekerja dengan baik !!URLComponents
danURLQueryItem
jauh lebih bersih.Anda dapat menggunakan komponen URLC untuk menghindari keharusan secara manual menyandikan string kueri Anda:
sumber
URLQueryItem
tidak selalu disandikan dengan benar. Misalnya,Formula+One
akan dikodekan keFormula+One
, yang akan diterjemahkan keFormula One
. Karena itu berhati-hatilah dengan tanda plus.Swift 3:
1. encodingQuery:
hasil:
2. encodingURL:
hasil:
sumber
urlHostAllowed
untuk menyandikan parameter kueri salah karena tidak akan menyandikan?
,=
dan+
. Saat menyandikan parameter kueri, Anda harus menyandikan nama dan nilai parameter secara terpisah dan benar. Ini tidak akan berfungsi dalam kasus umum.urlHostAllowed
URLComponents
.+
char. Jadi satu-satunya pilihan adalah melakukannya secara manual:CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "+"))
Swift 3:
sumber
Cepat 4
Untuk menyandikan parameter dalam URL saya menemukan menggunakan
.alphanumerics
karakter mengatur opsi termudah:Menggunakan Set Karakter standar untuk Pengkodean URL (suka
URLQueryAllowedCharacterSet
atauURLHostAllowedCharacterSet
) tidak akan berfungsi, karena mereka tidak mengecualikan=
atau&
karakter.Catatan bahwa dengan menggunakan
.alphanumerics
itu akan mengkodekan beberapa karakter yang tidak perlu dikodekan (seperti-
,.
,_
atau~
- lihat 2.3 karakter Unreserved. Dalam RFC 3986). Saya menemukan menggunakan.alphanumerics
lebih sederhana daripada membangun set karakter khusus dan tidak keberatan beberapa karakter tambahan untuk dikodekan. Jika itu mengganggu Anda, buat set karakter khusus seperti yang dijelaskan dalam Cara persentase menyandikan String URL , seperti misalnya:Peringatan: The
encoded
parameter kekuatan yang terbuka. Untuk string unicode yang tidak valid, mungkin macet. Lihat Mengapa nilai pengembalian String.addingPercentEncoding () opsional? . Alih-alih membuka paksaencoded!
Anda dapat menggunakanencoded ?? ""
atau menggunakanif let encoded = ...
.sumber
Semuanya sama
sumber
.bridgeToOvjectiveC()
mendebat kedua dan tidak mendapatkan "Tidak dapat mengonversi tipe ekspresi 'CFString!' untuk mengetik 'CFString!' "?Swift 4:
Itu tergantung oleh aturan pengkodean yang diikuti oleh server Anda.
Apple menawarkan metode kelas ini, tetapi tidak melaporkan jenis protokol RCF yang diikuti.
Dengan mengikuti alat yang bermanfaat ini, Anda harus menjamin penyandian karakter ini untuk parameter Anda:
Dengan kata lain, berbicara tentang pengkodean URL, Anda harus mengikuti protokol RFC 1738 .
Dan Swift tidak mencakup pengkodean dari + char misalnya , tetapi ia bekerja dengan baik dengan tiga @:? karakter.
Jadi, untuk mengkodekan dengan benar setiap parameter Anda,
.urlHostAllowed
opsi tidak cukup, Anda harus menambahkan juga karakter khusus seperti:Semoga ini bisa membantu seseorang yang menjadi gila untuk mencari informasi ini.
sumber
Swift 4 (tidak diuji - beri komentar apakah berfungsi atau tidak. Terima kasih @sumizome untuk saran)
Cepat 3
Swift 2.2 (Meminjam dari Zaph dan mengoreksi kunci kueri url dan nilai parameter)
Contoh:
Ini adalah versi pendek dari jawaban Bryan Chen. Saya kira itu
urlQueryAllowed
memungkinkan karakter kontrol yang baik-baik saja kecuali mereka membentuk bagian dari kunci atau nilai dalam string kueri Anda pada titik mana mereka perlu melarikan diri.sumber
var
) dan kemudian memanggilnya.remove
di langkah kedua.Cepat 4.2
Solusi satu jalur yang cepat. Ganti
originalString
dengan String yang ingin Anda encode.Demo Arena Bermain Online
sumber
Membutuhkan ini sendiri, jadi saya menulis ekstensi String yang keduanya memungkinkan untuk string URLEncoding, serta tujuan akhir yang lebih umum, mengubah kamus parameter menjadi URL gaya URL "GET" Parameter:
Nikmati!
sumber
&
atau=
dalam parameter. Periksa solusi saya sebagai gantinya.Yang ini bekerja untuk saya.
Saya menemukan fungsi di atas dari tautan ini: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/ .
sumber
let Url = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")
sumber
SWIFT 4.2
Kadang-kadang ini terjadi hanya karena ada ruang di slug ATAU tidak adanya pengkodean URL untuk parameter yang melewati URL API.
CATATAN: Jangan lupa untuk menjelajahinya
bitmapRepresentation
.sumber
Ini bekerja untuk saya di Swift 5 . Kasing penggunaan mengambil URL dari clipboard atau yang serupa yang mungkin sudah lolos karakter tetapi yang juga mengandung karakter Unicode yang dapat menyebabkan
URLComponents
atauURL(string:)
gagal.Pertama, buat rangkaian karakter yang mencakup semua karakter URL-legal:
Selanjutnya, perluas
String
dengan metode untuk menyandikan URL:Yang dapat diuji seperti:
Nilai
url
di akhir: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
Perhatikan bahwa keduanya
%20
dan+
spasi dipertahankan, karakter Unicode dikodekan,%20
di dalam aslinyaurlText
tidak dikodekan ganda, dan jangkar (fragmen, atau#
) tetap.Sunting: Sekarang memeriksa validitas masing-masing komponen.
sumber
Untuk Swift 5 hingga endcode string
Cara Penggunaan ?
sumber
Tidak satu pun dari jawaban ini yang berhasil untuk saya. Aplikasi kami mogok ketika url berisi karakter non-Inggris.
Tergantung pada parameter dari apa yang Anda coba lakukan, Anda mungkin ingin membuat set karakter Anda sendiri. Di atas memungkinkan untuk karakter bahasa Inggris, dan
-._~/?%$!:
sumber