私は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エスケープ文字を置き換えるにはどうすればよいですか?
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
}
}
Swift 2以降(xCode 7)
var s = "aa bb -[:/?&=;+!@#$()',*]";
let sEncode = s.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
let sDecode = sEncode?.stringByRemovingPercentEncoding
stringByReplacingEscapesUsingEncoding
メソッドは正しく動作しています。 "+"
文字はパーセントエンコードの一部ではないです。このサーバーは誤って使用しています。ここでは、パーセントエスケープされたスペースを使用する必要があります(%20
)。特定の応答に対して、"+"
文字の場合は、既に行っているように、自分で置換を実行することでサーバーの動作を回避する必要があります。
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)" )
私の場合、「+ 55 11 99999-5555」のようなクエリ文字列のパラメーターの電話番号にプラス(「+」)信号が必要です。 Swift3(xcode 8.2)エンコーダーはプラス信号として「+」をエンコードしないが、スペースを発見した後、回避策にアピールする必要がありましたエンコード後:
Swift 3.
_strURL = _strURL.replacingOccurrences(of: "+", with: "%2B")