iOS中的URL解码
我正在使用Swift 1.2开发我的iPhone应用程序,我正在与一个http网络服务进行通信。
我得到的响应是查询字符串格式(键值对)和.Net
编码的URL。
我可以得到响应,但查找使用Swift进行解码的正确方法。
样品响应如下
status=1&message=The+transaction+for+GBP+12.50+was+successful
尝试以下方式解码并获取服务器响应
// This provides encoded response String var responseString = NSString(data: data, encoding: NSUTF8StringEncoding) as! String var decodedResponse = responseString.stringByReplacingEscapesUsingEncoding(NSUTF8StringEncoding)!
如何替换字符串中的所有URL转义字符?
要对URL进行编码和解码,请在项目中的某处创建此扩展:
Swift 2.0
extension String { func encodeUrl() -> String { return self.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet()) } func decodeUrl() -> String { return self.stringByRemovingPercentEncoding } }
Swift 3.0
extension String { func encodeUrl() -> String { return self.addingPercentEncoding( withAllowedCharacters: NSCharacterSet.urlQueryAllowed()) } func decodeUrl() -> String { return self.removingPercentEncoding } }
Swift 4.1
extension String { func encodeUrl() -> String? { return self.addingPercentEncoding( withAllowedCharacters: NSCharacterSet.urlQueryAllowed) } func decodeUrl() -> String? { return self.removingPercentEncoding } }
Swift 2及更高版本(xCode 7)
var s = "aa bb -[:/?&=;+!@#$()',*]"; let sEncode = s.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) let sDecode = sEncode?.stringByRemovingPercentEncoding
stringByReplacingEscapesUsingEncoding
方法表现正常。 "+"
字符不是百分比编码的一部分 。 此服务器使用不正确; 它应该在这里使用百分比转义空间( %20
)。 如果对于特定的响应,您希望空格中看到"+"
字符,则只需通过自己执行替换来解决服务器行为,就像您现在所做的那样。
在我的情况下,我需要在查询字符串的参数中的电话号码中添加加号(“+”)信号,例如“+55 11 99999-5555”。 在我发现swift3(xcode 8.2)编码器不将“+”编码为加号信号,但是空格后,我不得不在编码后采用一种解决方法:
Swift 3.0
_strURL = _strURL.replacingOccurrences(of: "+", with: "%2B")
在Swift 3中
extension URL { var parseQueryString: [String: String] { var results = [String: String]() if let pairs = self.query?.components(separatedBy: "&"), pairs.count > 0 { for pair: String in pairs { if let keyValue = pair.components(separatedBy: "=") as [String]? { results.updateValue(keyValue[1], forKey: keyValue[0]) } } } return results } }
在您的代码中访问下面
let parse = url.parseQueryString print("parse \(parse)" )