我正在使用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)!
如何替换字符串中的所有网址转义字符?
答案 0 :(得分:69)
要对网址进行编码和解码,请在项目的某处创建此扩展:
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
}
}
答案 1 :(得分:8)
Swift 2及更高版本(xCode 7)
var s = "aa bb -[:/?&=;+!@#$()',*]";
let sEncode = s.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
let sDecode = sEncode?.stringByRemovingPercentEncoding
答案 2 :(得分:3)
stringByReplacingEscapesUsingEncoding
方法表现正常。 "+"
字符不属于百分比编码。此服务器使用不正确;它应该在这里使用百分比转义空间(%20
)。如果对于特定的响应,您希望空格中显示"+"
个字符,则只需通过自己执行替换来解决服务器行为,就像您现在所做的那样。
答案 3 :(得分:0)
在我的情况下,我需要在查询字符串的参数中的电话号码中添加加号(" +")信号,例如" +55 11 99999-5555"。在我发现swift3(xcode 8.2)编码器不编码" +"作为加号信号,但空间,我必须在编码 之后采用 解决方法:
Swift 3.0
_strURL = _strURL.replacingOccurrences(of: "+", with: "%2B")
答案 4 :(得分:0)
在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)" )
答案 5 :(得分:0)
最好使用内置的URLComponents
结构,因为它遵循正确的准则。
extension URL
{
var parameters: [String: String?]?
{
if let components = URLComponents(url: self, resolvingAgainstBaseURL: false),
let queryItems = components.queryItems
{
var parameters = [String: String?]()
for item in queryItems {
parameters[item.name] = item.value
}
return parameters
} else {
return nil
}
}
}
答案 6 :(得分:0)
您只需要:
print("Decode: ", yourUrlAsString.removingPercentEncoding)