日常的開發(fā)當(dāng)中,網(wǎng)絡(luò)請求是不可或缺的。而在網(wǎng)絡(luò)訪問請求中形用,經(jīng)常會(huì)遇到有中文空格字符的情況就轧,直接用這些字符串去訪問是無法正常訪問,需要我們做進(jìn)一步的處理田度。
一般處理
let urlString = "http://10.0.3.86/中文/main.html#/help"
比如以上的url妒御,想使用webview進(jìn)行訪問或者是原生發(fā)起http請求,都需要進(jìn)行轉(zhuǎn)碼處理镇饺。
有人會(huì)問乎莉,這有什么難的?拿起鍵盤就是干
OC:
NSString* encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Swift:
let encodedString = urlString.addingPercentEscapes(using: .utf8)
一敲代碼奸笤,emmmmm~~ Xcode發(fā)警告了惋啃,該方法已經(jīng)過期,用下面的方法替代监右,于是緊接著:
OC:
NSString* encodedString = [urtString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
Swift:
let encodedString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
OK,轉(zhuǎn)碼處理一下边灭,再訪問轉(zhuǎn)碼之后的url。
what健盒?還是不能正常訪問绒瘦?
我們來看看轉(zhuǎn)碼之后的url是什么:
原來是因?yàn)樽詈蟮?被轉(zhuǎn)碼成了%23
前端開發(fā)的小伙伴說這個(gè)#不能動(dòng),只能我們不轉(zhuǎn)碼扣癣。不轉(zhuǎn)碼那么夾雜中文字符怎么辦呢惰帽?—— 修改參數(shù)。
所以我們的需求變化成:除了url里面的#不動(dòng)父虑,其他該轉(zhuǎn)碼的都轉(zhuǎn)碼
NSMutableCharacterSet *set = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
[set addCharactersInString:@"#"];
NSString *encodedString = [urlSring stringByAddingPercentEncodingWithAllowedCharacters:set];
如上手動(dòng)修改轉(zhuǎn)碼參數(shù)该酗,OK 可以了。
Swift如法炮制
let charSet = CharacterSet.urlQueryAllowed as! NSMutableCharacterSet
charSet.addCharacters(in: "#")
let encodingString = urlStr.addingPercentEncoding(withAllowedCharacters: charSet as CharacterSet)
雖然語言不一樣士嚎,但是思路一樣呜魄。emmmm...你會(huì)驚人的發(fā)現(xiàn),根本不管用@绸谩8浮!
原因分析
問題是出在let charSet = CharacterSet.urlQueryAllowed as! NSMutableCharacterSet
這一行膳殷,在swift語言中操骡,F(xiàn)oundation框架中的很多class都重新用struct重寫了,比如NSString和String赚窃,NSUrl和URL册招,如果要使用類似于OC一些特性,有時(shí)候需要as來強(qiáng)轉(zhuǎn)成對應(yīng)的NS開頭的類勒极。強(qiáng)轉(zhuǎn)的過程中是掰,CharacterSet應(yīng)該轉(zhuǎn)成NSCharacterSet,而不應(yīng)該是NSMutableCharacterSet,也就是說子類指針指向了父類對象辱匿,父類里面沒有子類的方法键痛,所以執(zhí)行charSet.addCharacters(in: "#")
的時(shí)候炫彩,無法正確添加。
Swift正確的寫法
順著原因一路分析絮短,應(yīng)該這么寫:
方法一:
let charSet = CharacterSet.urlQueryAllowed as NSCharacterSet
let mutSet = charSet.mutableCopy() as! NSMutableCharacterSet
mutSet.addCharacters(in: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: mutSet as CharacterSet)
當(dāng)然還有其他寫法:
方法二:
let charSet = NSMutableCharacterSet()
charSet.formUnion(with: CharacterSet.urlQueryAllowed)
charSet.addCharacters(in: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: charSet as CharacterSet)
方法一和二本質(zhì)是一樣的江兢,其實(shí)沿用的OC的思想,先構(gòu)造一個(gè)可變對象丁频,再加入自定義的字符杉允。如果要像OC這么搞,那么蘋果設(shè)計(jì)swift的意義何在席里?換句話說叔磷,swift用結(jié)構(gòu)體寫重寫這個(gè)類一定考慮到這個(gè)問題,那就應(yīng)該有相應(yīng)的處理方法奖磁。
查閱官方文檔吧改基,少年!
果不其然咖为,找到一個(gè)方法秕狰,用來插入字符。
所以還有第三種寫法:
方法三:
var charSet = CharacterSet.urlQueryAllowed
charSet.insert(charactersIn: "#")
let encodingURL = urlStr.addingPercentEncoding(withAllowedCharacters: charSet )
我們來看一下最終結(jié)果
OK案疲,符合需求!