web-dev-qa-db-ja.com

iOSでのURLデコード

私はSwift 1.2を使用してiPhoneアプリケーションを開発しており、http Webサービスと通信しています。

私が受け取っている応答は、クエリ文字列形式(キーと値のペア)および.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エスケープ文字を置き換えるにはどうすればよいですか?

31
JibW

URLをエンコードおよびデコードするには、プロジェクトのどこかにこのエクステンションを作成します。

Swift 2.

extension String
{   
    func encodeUrl() -> String
    {
        return self.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet())
    }
func decodeUrl() -> String
    {
        return self.stringByRemovingPercentEncoding
    }

}

Swift 3.

 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
    }
}
71
Vyacheslav

Swift 2以降(xCode 7)

var s = "aa bb -[:/?&=;+!@#$()',*]";

let sEncode = s.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

let sDecode = sEncode?.stringByRemovingPercentEncoding
8
米米米

stringByReplacingEscapesUsingEncodingメソッドは正しく動作しています。 "+"文字はパーセントエンコードの一部ではないです。このサーバーは誤って使用しています。ここでは、パーセントエスケープされたスペースを使用する必要があります(%20)。特定の応答に対して、"+"文字の場合は、既に行っているように、自分で置換を実行することでサーバーの動作を回避する必要があります。

3
matt

In Swift

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)" )
0
Amul4608

私の場合、「+ 55 11 99999-5555」のようなクエリ文字列のパラメーターの電話番号にプラス(「+」)信号が必要です。 Swift3(xcode 8.2)エンコーダーはプラス信号として「+」をエンコードしないが、スペースを発見した後、回避策にアピールする必要がありましたエンコード後

Swift 3.

_strURL = _strURL.replacingOccurrences(of: "+", with: "%2B")
0
Caiçara