iOS中的URL解码

时间:2015-10-06 16:16:47

标签: ios swift urldecode

我正在使用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)!

如何替换字符串中的所有网址转义字符?

7 个答案:

答案 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)