Swift 将加号(+;)解码为URL组件中的空格

Swift 将加号(+;)解码为URL组件中的空格,swift,foundation,Swift,Foundation,我在URL中有一个查询项:q=Yellowstone+national+park。使用URLComponents解码并提取查询值时,我得到的是Yellowstone+国家+公园,而不是黄石国家公园 let someURL = URL(string: "https://www.example.com/?q=Yellowstone+national+park")! let components = URLComponents(url: someURL, resolvingAgainstBaseURL

我在URL中有一个查询项:
q=Yellowstone+national+park
。使用
URLComponents
解码并提取查询值时,我得到的是
Yellowstone+国家+公园
,而不是
黄石国家公园

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+国家+公园
-->
Yellowstone+国家+公园


是否有
url组件可以自动将
+
转换为空格
?谢谢

来自苹果文档:

RFC 3986指定哪些字符必须在 URL的查询组件,但不包括这些字符应如何显示 解释。使用分隔键-值对是一种常见的方法 约定,但未通过规范进行标准化。所以你 可能会遇到与其他实现的互操作性问题 按照这个惯例

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

根据RFC 3986,加号是一个字符中的有效字符 查询,不需要进行百分比编码。但是根据 W3C关于URI寻址的建议中,加号是保留的 作为查询字符串中空格的简写符号(例如, 问候语=你好+世界)

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

不知道投票否决的原因答案:


此处描述的类似问题:

来自苹果文档:

RFC 3986指定哪些字符必须在 URL的查询组件,但不包括这些字符应如何显示 解释。使用分隔键-值对是一种常见的方法 约定,但未通过规范进行标准化。所以你 可能会遇到与其他实现的互操作性问题 按照这个惯例

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

根据RFC 3986,加号是一个字符中的有效字符 查询,不需要进行百分比编码。但是根据 W3C关于URI寻址的建议中,加号是保留的 作为查询字符串中空格的简写符号(例如, 问候语=你好+世界)

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

不知道投票否决的原因答案:


此处描述的类似问题:

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

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

你可以做一个简单的替换操作

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