首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快速编码URL

快速编码URL
EN

Stack Overflow用户
提问于 2014-07-03 10:56:02
回答 19查看 328.1K关注 0票数 376

如果我像这样编码一个字符串:

代码语言:javascript
运行
复制
var escapedString = originalString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

它不能逃脱斜杠/

我搜索并找到了这个目标C代码:

代码语言:javascript
运行
复制
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                        NULL,
                        (CFStringRef)unencodedString,
                        NULL,
                        (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                        kCFStringEncodingUTF8 );

是否有一种更简单的方式来编码一个URL,如果不是,我如何用Swift写这个呢?

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2014-07-03 11:05:01

Swift 3

在Swift 3中有addingPercentEncoding

代码语言:javascript
运行
复制
let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)

输出:

测试%2 2Ftest

Swift 1

在iOS 7及以上版本中,有stringByAddingPercentEncodingWithAllowedCharacters

代码语言:javascript
运行
复制
var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")

输出:

测试%2 2Ftest

以下是有用的(倒排)字符集:

代码语言:javascript
运行
复制
URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>?@[\]^`

如果要转义一组不同的字符,请创建一组:

添加"=“字符的示例:

代码语言:javascript
运行
复制
var originalString = "test/test=42"
var customAllowedSet =  NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")

输出:

测试%2 2Ftest%3D42

示例以验证非集合中的ascii字符:

代码语言:javascript
运行
复制
func printCharactersInSet(set: NSCharacterSet) {
    var characters = ""
    let iSet = set.invertedSet
    for i: UInt32 in 32..<127 {
        let c = Character(UnicodeScalar(i))
        if iSet.longCharacterIsMember(i) {
            characters = characters + String(c)
        }
    }
    print("characters not in set: \'\(characters)\'")
}
票数 714
EN

Stack Overflow用户

发布于 2017-04-27 21:27:38

您可以使用URLComponents来避免手动编码查询字符串的百分比:

代码语言:javascript
运行
复制
let scheme = "https"
let host = "www.google.com"
let path = "/search"
let queryItem = URLQueryItem(name: "q", value: "Formula One")


var urlComponents = URLComponents()
urlComponents.scheme = scheme
urlComponents.host = host
urlComponents.path = path
urlComponents.queryItems = [queryItem]

if let url = urlComponents.url {
    print(url)   // "https://www.google.com/search?q=Formula%20One"
}
代码语言:javascript
运行
复制
extension URLComponents {
    init(scheme: String = "https",
         host: String = "www.google.com",
         path: String = "/search",
         queryItems: [URLQueryItem]) {
        self.init()
        self.scheme = scheme
        self.host = host
        self.path = path
        self.queryItems = queryItems
    }
}
代码语言:javascript
运行
复制
let query = "Formula One"
if let url = URLComponents(queryItems: [URLQueryItem(name: "q", value: query)]).url {
    print(url)  // https://www.google.com/search?q=Formula%20One
}
票数 99
EN

Stack Overflow用户

发布于 2018-03-12 08:56:23

Swift 4&5

要在URL中编码参数,我发现使用.alphanumerics字符集是最简单的选项:

代码语言:javascript
运行
复制
let urlEncoded = value.addingPercentEncoding(withAllowedCharacters: .alphanumerics)
let url = "http://www.example.com/?name=\(urlEncoded!)"

使用任何用于URL编码的标准字符集(如.urlQueryAllowed.urlHostAllowed)都不起作用,因为它们不排除=&字符。

注意到,通过使用.alphanumerics,它将编码一些不需要编码的字符(比如-._~ --参见2.3 )。RFC 3986中的无保留字符)。我发现使用.alphanumerics比构建自定义字符集更简单,并且不介意要编码的其他字符。如果这让您感到困扰,请按照如何对URL字符串进行百分比编码中的描述构造一个自定义字符集,例如:

代码语言:javascript
运行
复制
// Store allowed character set for reuse (computed lazily).
private let urlAllowed: CharacterSet =
    .alphanumerics.union(.init(charactersIn: "-._~")) // as per RFC 3986

extension String {
    var urlEncoded: String? {
        return addingPercentEncoding(withAllowedCharacters: urlAllowed)
    }
}

let url = "http://www.example.com/?name=\(value.urlEncoded!)"

警告:-- urlEncoded参数是强制展开的。对于无效的unicode字符串,它可能会崩溃。见为什么String.addingPercentEncoding()的返回值是可选的?。与强制展开urlEncoded!不同,您可以使用urlEncoded ?? ""if let urlEncoded = urlEncoded { ... }

票数 79
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24551816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档