为什么 NSURL 不接受包含引号或大括号的有效字符串?

Why won't NSURL accept a valid string that contains quotes or braces?

编辑

https://www.someurl.com/search?&access_token=1,84,848473938;848483,83&_json={"key1":"value1","key2":"value2"}

当声明一个具有 JSON 字符串的 URL 时,我显然需要使用大括号 _json={ } 和 qoutes \"key1\":\"value1\"

NSURL(string: String),但是,如果这些字符中的任何一个包含在字符串中,就会神奇地变成 nil

所以在这里正确回答:,我尝试使用:

let url = NSURL(string: url.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!)

但我认为它已被弃用,因为它是在 Swift 2 发布之前,我收到错误:cannot convert value of Type NSCharacterSet to expected argument type NSStringEncoding (aka UInt)

所以我尝试使用

let url = NSURL(string: url.stringByAddingPercentEncodingWithAllowedCharacters(NSUTF8StringEncoding)!)!

虽然这确实允许 NSURL 有一个值而不是 nil,但它没有 return 预期的结果,所以还是有问题。

我知道格式是正确的,因为如果我在浏览器中手动输入 URL 字符串,我会得到预期的结果。如果我 copy/paste 来自 Xcode 的编码版本,它会给我错误的结果,就像 Swift 在如上所示编码时那样。

如有任何见解,我们将不胜感激。

您可以修改可变字符集以删除允许的字符:因为您希望对逗号进行编码,请在使用前从 URLQueryAllowedCharacterSet 中删除逗号。

Swift2中,我们需要像这样和NSMutableCharacterSet一起跳舞:

let sourceURL = "https://www.someurl.com/search?&access_token=1,84,848473938;848483,83&_json={\"key1\":\"value1\",\"key2\":\"value2\"}"

let charSet = NSMutableCharacterSet()
charSet.formUnionWithCharacterSet(NSCharacterSet.URLQueryAllowedCharacterSet())
charSet.removeCharactersInString(",")

let url = NSURL(string: sourceURL.stringByAddingPercentEncodingWithAllowedCharacters(charSet)!)

print(url!)

打印:

https://www.someurl.com/search?&access_token=1%2C84%2C848473938;848483%2C83&_json=%7B%22key1%22:%22value1%22%2C%22key2%22:%22value2%22%7D

要用 Swift 3 做同样的事情,我们使用 CharacterSet 结构而不是 NSMutableCharacterSet 但这是相同的想法:

var charSet = CharacterSet()
charSet.formUnion(.urlQueryAllowed)
charSet.remove(",")
if let encoded = sourceURL.addingPercentEncoding(withAllowedCharacters: charSet) {
    if let url = URL(string: encoded) {
        print(url)
    }
}