Saya memiliki string URL ( NSString) dengan spasi dan &karakter. Bagaimana cara saya menyandikan seluruh string (termasuk &karakter dan spasi ampersand)?
Sayangnya, stringByAddingPercentEscapesUsingEncodingtidak selalu berhasil 100%. Ini mengkodekan karakter non-URL tetapi meninggalkan karakter yang dipesan (seperti slash /dan ampersand &) sendirian. Rupanya ini adalah bug yang diketahui Apple, tetapi karena mereka belum memperbaikinya, saya telah menggunakan kategori ini untuk meng-url-encode sebuah string:
Mengapa Anda menggunakan kategori yang rumit seperti ini daripada hanya menjatuhkannya ke CFURLCreateStringByAddingPercentEscapes () , di mana Anda dapat secara eksplisit menentukan karakter yang ingin selalu Anda hindari.
Lily Ballard
8
@KevinBallard karena fungsi CF bekerja pada model inklusif ("melarikan diri karakter ini"), dan biasanya Anda ingin bekerja pada model eksklusif ("melarikan diri semua kecuali karakter ini")
@DaveDeLong Mungkin itu yang saya dapatkan. Ini merupakan kategori standar di semua proyek saya selama kurang lebih satu tahun, jadi saya kira Anda mungkin sumber aslinya! Saya telah mengedit kata-katanya sehingga sepertinya saya tidak mencoba mengambil kredit untuk menulisnya).
chown
4
Mengapa? if (thisChar == '') {[output appendString: @ "+"]; } Tanpa ini jika akan menyandikan spasi dengan% 20 seperti yang saya harapkan
Ini juga tidak menyandikan pembatas parameter dengan benar seperti '&', '?' dalam kasus di mana Anda mengirimkan konten ke API.
Ben Lachman
'&' bukan karakter yang valid untuk parameter string kueri URL. Coba gunakan '& amp;' sebagai gantinya.
Nishant
1
stringByAddingPercentEscapesUsingEncoding DEPRECATED " -stringByAddingPercentEncodingWithAllowedCharacters:Sebagai gantinya, gunakan yang selalu menggunakan pengkodean UTF-8 yang direkomendasikan, dan yang mengkodekan untuk komponen URL tertentu atau subkomponen karena setiap komponen URL atau subkomponen memiliki aturan yang berbeda untuk karakter apa yang valid."
Mihir Oza
89
API baru telah ditambahkan sejak jawaban dipilih; Anda sekarang dapat menggunakan NSURLUtilities. Karena berbagai bagian URL memungkinkan karakter yang berbeda, gunakan rangkaian karakter yang berlaku. Contoh berikut ini dikodekan untuk dimasukkan dalam string kueri:
Butuh beberapa saat untuk mencari tahu apa yang Anda maksud dengan "gunakan NSURLUtilities" - tetapi sekarang saya melihat bahwa itulah nama kategori NSString di mana Apple mendefinisikan metode baru ini di iOS 7 dan OS X 10.9.
Ya. Itu juga terdaftar sebagai NSURLUtilities dalam daftar API baru yang dirilis.
Peter DeWeese
Tentu saja '&' diizinkan dalam string kueri, jadi saya akan mengedit jawaban saya menggunakan tautan Richard.
Peter DeWeese
3
NSMakeRange('&', 1)tidak berfungsi di Swift, karena Swift tidak mengizinkan konversi char ke int tanpa peretasan. Untuk menggunakan solusi ini dalam kode Swift, gunakan removeCharactersInString("&")sebagai ganti.removeCharactersInRange(...)
cbh2000
16
Contoh Swift 2.0 (iOS 9 Compatiable)
extension String{
func stringByURLEncoding()->String?{
let characters =NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as!NSMutableCharacterSet
characters.removeCharactersInString("&")
guard let encodedString = self.stringByAddingPercentEncodingWithAllowedCharacters(characters)else{return nil
}return encodedString
}}
Ini sebenarnya tergantung pada server Anda untuk karakter yang diperbolehkan, di sini, pada contoh saya di server saya menggunakannya hanya diizinkan set karakter alfanumerik, Anda dapat mengubahnya ke karakter tertentu untuk memenuhi kebutuhan Anda.
Underdog
1
Pertanyaannya adalah tentang penyandian karakter '&'.
Steve Moser
8
Saya memilih untuk menggunakan CFURLCreateStringByAddingPercentEscapespanggilan seperti yang diberikan oleh jawaban yang diterima, namun dalam versi terbaru XCode (dan iOS), itu menghasilkan kesalahan, jadi gunakan yang berikut sebagai gantinya:
Ini bukan ruang encoding. Contoh @ "string string" dan @ "string & string" dikodekan dengan benar. Tolong beri tahu saya masukan Anda sama.
Yogesh Lolusare
2
bagi saya sebagian besar waktu yang dihabiskan untuk menyelesaikan ini adalah periode penolakan di mana saya menolak untuk percaya kerangka kerja tidak mengandung sesuatu yang bernama mirip dengan 'urlencode' yang melakukan ini tanpa main-main ..
dancl
6
Cobalah menggunakan stringByAddingPercentEncodingWithAllowedCharactersmetode dengan [NSCharacterSet URLUserAllowedCharacterSet]itu akan mencakup semua kasus
Tujuan C
NSString*value =@"Test / Test";
value =[value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetURLUserAllowedCharacterSet]];
cepat
var value ="Test / Test"
value.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLUserAllowedCharacterSet())
Setelah membaca semua jawaban untuk topik ini dan yang ( salah ) diterima, saya ingin menambahkan kontribusi saya.
JIKA targetnya adalah iOS7 +, dan pada 2017 semestinya sejak XCode membuat sangat sulit untuk memberikan kompatibilitas di bawah iOS8, cara terbaik, aman thread, cepat, dan akan dukungan penuh UTF-8 untuk melakukan ini adalah:
(Kode C tujuan)
@implementationNSString(NSString_urlencoding)-(NSString*)urlencode {staticNSMutableCharacterSet*chars = nil;staticdispatch_once_t pred;if(chars)return[self stringByAddingPercentEncodingWithAllowedCharacters:chars];// to be thread safe
dispatch_once(&pred,^{
chars =NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;[chars removeCharactersInString:@"!*'();:@&=+$,/?%#[]"];});return[self stringByAddingPercentEncodingWithAllowedCharacters:chars];}@end
Ini akan memperluas NSString, akan mengecualikan karakter terlarang RFC, mendukung karakter UTF-8, dan membiarkan Anda menggunakan hal-hal seperti:
let stringURL ="YOUR URL TO BE ENCODE";
let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
print(encodedURLString)
Karena, stringByAddingPercentEscapesUsingEncodingmenyandikan karakter bukan URL tetapi meninggalkan karakter yang dipesan (seperti !*'();:@&=+$,/?%#[]), Anda dapat menyandikan url seperti kode berikut:
let stringURL ="YOUR URL TO BE ENCODE";
let characterSetTobeAllowed =(CharacterSet(charactersIn:"!*'();:@&=+$,/?%#[] ").inverted)if let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters: characterSetTobeAllowed){
print(encodedURLString)}
Jika Anda perlu meng-enkode seluruh string URL, Anda dapat menggunakan kode ini untuk menyandikan NSString yang dimaksudkan sebagai URL (dalam urlStringToEncode):
sepertinya tidak berfungsi, karakter seperti & masih dibiarkan sendiri
kjyv
1
Dalam kasus saya di mana komponen terakhir adalah huruf Arab yang saya lakukan berikut di Swift 2.2:
extension String{
func encodeUTF8()->String?{//If I can create an NSURL out of the string nothing is wrong with itif let _ = NSURL(string: self){return self
}//Get the last component from the string this will return subSequence
let optionalLastComponent = self.characters.split { $0 =="/"}.last
if let lastComponent = optionalLastComponent {//Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String
let lastComponentAsString = lastComponent.map{String($0)}.reduce("", combine:+)//Get the range of the last componentif let rangeOfLastComponent = self.rangeOfString(lastComponentAsString){//Get the string without its last component
let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)//Encode the last componentif let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()){//Finally append the original string (without its last component) to the encoded part (encoded last component)
let encodedString = stringWithoutLastComponent + lastComponentEncoded
//Return the string (original string/encoded string)return encodedString
}}}return nil;}}
pemakaian:
let stringURL ="http://xxx.dev.com/endpoint/nonLatinCharacters"if let encodedStringURL = stringURL.encodeUTF8(){if let url = NSURL(string: encodedStringURL){...}}
Tetapi sudah tidak digunakan lagi di iOS 9. Apa kode yang diperbarui untuk ini?
Sujit Nachan
1
Begitu banyak jawaban tetapi tidak berhasil untuk saya, jadi saya mencoba yang berikut:
fun simpleServiceCall(for serviceUrl:String, appendToUrl:String){
let urlString:String= serviceUrl + appendToUrl.addingPercentEncoding(withAllowedCharacters:.urlPathAllowed)!
let finalUrl = URL(string: urlString)!//continue to execute your service call... }
Saya menghadapi masalah serupa melewati string kompleks sebagai parameter POST. String saya dapat berisi karakter Asia, spasi, kutipan, dan segala macam karakter khusus. Solusi yang akhirnya saya temukan adalah mengubah string saya menjadi seri unicodes yang cocok, misalnya "Hu0040Hu0020Hu03f5 ...." menggunakan [NSString stringWithFormat: @ "Hu% 04x", [string characterAtIndex: i]] untuk mendapatkan Unicode dari masing-masing karakter dalam string asli. Hal yang sama dapat dilakukan di Jawa.
String ini dapat dengan aman diteruskan sebagai parameter POST.
Di sisi server (PHP), saya mengubah semua "H" menjadi "\" dan saya meneruskan string yang dihasilkan ke json_decode. Langkah terakhir adalah menghindari tanda kutip tunggal sebelum menyimpan string ke dalam MySQL.
Dengan cara ini saya dapat menyimpan string UTF8 di server saya.
Jawaban:
Sayangnya,
stringByAddingPercentEscapesUsingEncoding
tidak selalu berhasil 100%. Ini mengkodekan karakter non-URL tetapi meninggalkan karakter yang dipesan (seperti slash/
dan ampersand&
) sendirian. Rupanya ini adalah bug yang diketahui Apple, tetapi karena mereka belum memperbaikinya, saya telah menggunakan kategori ini untuk meng-url-encode sebuah string:Digunakan seperti ini:
Ini juga berfungsi:
Beberapa bacaan yang bagus tentang subjek:
Objektif-c iPhone persen menyandikan string?
Pengodean Objective-C dan Swift URL
http://cybersam.com/programming/proper-url-percent-encoding-in-ios
https://devforums.apple.com/message/15674#15674 http://simonwoodside.com/weblog/2009/4/ 22 / how_to_really_url_encode /
sumber
Ini mungkin bermanfaat
Untuk iOS 7+, cara yang disarankan adalah:
Anda dapat memilih set karakter yang diizinkan sesuai persyaratan komponen URL.
sumber
-stringByAddingPercentEncodingWithAllowedCharacters:
Sebagai gantinya, gunakan yang selalu menggunakan pengkodean UTF-8 yang direkomendasikan, dan yang mengkodekan untuk komponen URL tertentu atau subkomponen karena setiap komponen URL atau subkomponen memiliki aturan yang berbeda untuk karakter apa yang valid."API baru telah ditambahkan sejak jawaban dipilih; Anda sekarang dapat menggunakan NSURLUtilities. Karena berbagai bagian URL memungkinkan karakter yang berbeda, gunakan rangkaian karakter yang berlaku. Contoh berikut ini dikodekan untuk dimasukkan dalam string kueri:
Untuk secara khusus mengonversi '&', Anda harus menghapusnya dari set kueri url atau menggunakan set lain, karena '&' diizinkan dalam kueri URL:
sumber
NSMakeRange('&', 1)
tidak berfungsi di Swift, karena Swift tidak mengizinkan konversi char ke int tanpa peretasan. Untuk menggunakan solusi ini dalam kode Swift, gunakanremoveCharactersInString("&")
sebagai ganti.removeCharactersInRange(...)
Contoh Swift 2.0 (iOS 9 Compatiable)
sumber
pembaruan ios 7
sumber
Saya memilih untuk menggunakan
CFURLCreateStringByAddingPercentEscapes
panggilan seperti yang diberikan oleh jawaban yang diterima, namun dalam versi terbaru XCode (dan iOS), itu menghasilkan kesalahan, jadi gunakan yang berikut sebagai gantinya:sumber
Cobalah menggunakan
stringByAddingPercentEncodingWithAllowedCharacters
metode dengan[NSCharacterSet URLUserAllowedCharacterSet]
itu akan mencakup semua kasusTujuan C
cepat
Keluaran
Test%20%2F%20Test
sumber
Setelah membaca semua jawaban untuk topik ini dan yang ( salah ) diterima, saya ingin menambahkan kontribusi saya.
JIKA targetnya adalah iOS7 +, dan pada 2017 semestinya sejak XCode membuat sangat sulit untuk memberikan kompatibilitas di bawah iOS8, cara terbaik, aman thread, cepat, dan akan dukungan penuh UTF-8 untuk melakukan ini adalah:
(Kode C tujuan)
Ini akan memperluas NSString, akan mengecualikan karakter terlarang RFC, mendukung karakter UTF-8, dan membiarkan Anda menggunakan hal-hal seperti:
Itu akan dicetak pada konsol debug Anda:
... perhatikan juga penggunaan dispatch_once untuk menghindari beberapa inisialisasi dalam lingkungan multithread.
sumber
Berikut ini adalah pendekatan fleksibel siap-produksi di Swift 5.x :
Contoh penggunaan:
Keluaran:
sumber
Gunakan komponen NSURLC untuk mengkodekan parameter GET HTTP:
http://www.ralfebert.de/snippets/ios/encoding-nsurl-get-parameters/
sumber
Kode ini membantu saya untuk penyandian karakter khusus
sumber
kode cepat berdasarkan jawaban objek chown di utas ini.
sumber
Di Swift 3 , silakan coba di bawah ini:
Karena,
stringByAddingPercentEscapesUsingEncoding
menyandikan karakter bukan URL tetapi meninggalkan karakter yang dipesan (seperti!*'();:@&=+$,/?%#[]
), Anda dapat menyandikan url seperti kode berikut:sumber
Dalam cepat 3:
sumber
Saran Apple, dalam catatan rilis 10.11, adalah:
Jika Anda perlu meng-enkode seluruh string URL, Anda dapat menggunakan kode ini untuk menyandikan NSString yang dimaksudkan sebagai URL (dalam urlStringToEncode):
sumber
Dalam kasus saya di mana komponen terakhir adalah huruf Arab yang saya lakukan berikut di
Swift 2.2
:pemakaian:
sumber
menurut blog berikut
sumber
Begitu banyak jawaban tetapi tidak berhasil untuk saya, jadi saya mencoba yang berikut:
Semoga itu bisa membantu seseorang. Terima kasih
sumber
Untuk parameter kueri yang di-encode formulir www, saya membuat kategori di NSString:
sumber
// Ini tanpa ujian
sumber
Saya menghadapi masalah serupa melewati string kompleks sebagai parameter POST. String saya dapat berisi karakter Asia, spasi, kutipan, dan segala macam karakter khusus. Solusi yang akhirnya saya temukan adalah mengubah string saya menjadi seri unicodes yang cocok, misalnya "Hu0040Hu0020Hu03f5 ...." menggunakan [NSString stringWithFormat: @ "Hu% 04x", [string characterAtIndex: i]] untuk mendapatkan Unicode dari masing-masing karakter dalam string asli. Hal yang sama dapat dilakukan di Jawa.
String ini dapat dengan aman diteruskan sebagai parameter POST.
Di sisi server (PHP), saya mengubah semua "H" menjadi "\" dan saya meneruskan string yang dihasilkan ke json_decode. Langkah terakhir adalah menghindari tanda kutip tunggal sebelum menyimpan string ke dalam MySQL.
Dengan cara ini saya dapat menyimpan string UTF8 di server saya.
sumber
Yang ini bekerja untuk saya.
Saya menemukan fungsi di atas dari tautan ini: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/
Anda juga dapat menggunakan fungsi ini dengan ekstensi cepat. Tolong beri tahu saya jika ada masalah.
sumber