将加号(+)解码到URLComponent

时间:2018-08-21 18:40:03

标签: swift foundation

我在URL q=Yellowstone+national+park中有一个查询项。当使用URLComponents通过以下代码解码和提取查询值时,我得到的是Yellowstone+national+park而不是Yellowstone national park

let someURL = URL(string: "https://www.example.com/?q=Yellowstone+national+park")!
let components = URLComponents(url: someURL, resolvingAgainstBaseURL: true)

let keyword = components?.queryItems?.first(where: { (queryItem) -> Bool in
        return queryItem.name == "q"
    })?.value ?? "Keyword is empty"

我发现URLComponents可以很好地用于百分比编码查询:

  

q=%E8%BF%87%E5%B1%B1%E8%BD%A6-> 过山车

     

q=Yellowstone+national+park-> Yellowstone+national+park

反正URLComponents是否可以自动将+转换为空格?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以执行简单的替换操作

let keyword = components?.queryItems?.first(where: { (queryItem) -> Bool in
    return queryItem.name == "q"
})?.value?.replacingOccurrences(of: "+", with: " ") ?? "Keyword is empty"

答案 1 :(得分:-1)

来自Apple文档:

  

RFC 3986指定必须在字符中对哪些字符进行百分比编码   URL的查询组成部分,而不是这些字符应如何组成   解释。分隔键值对的使用很常见   约定,但未通过规范进行标准化。因此,你   与其他实现可能会遇到互操作性问题   遵循这个约定。

     

潜在的互操作性问题的一个著名例子是   加号(+)字符被处理:

     

根据RFC 3986,加号是在   查询,并且不需要进行百分比编码。但是,根据   W3C关于URI寻址的建议,加号保留   作为查询字符串中空格的简写形式(例如,   ?greeting = hello + world)。

     

如果URL查询组件包含根据RFC格式化的日期   3339,时区偏移量中带有加号(例如,   2013-12-31T14:00:00 + 00:00),将加号解释为空格   导致无效的时间格式。 RFC 3339指定日期应如何   格式化,但不建议是否必须加号   网址中的百分比编码。 取决于实施情况   此网址,您可能需要先对加号进行百分比编码   字符。

不知道拒绝答案的原因:

此处描述的类似问题:fetch_all()