let url = URL(string: "https://example.com")
let path = "/somePath?"
let urlWithPath = url?.appendingPathComponent(path)
追加后,路径/somePath?
变为somePath%3F
。
?
变为%3F
。问号将替换为百分比编码的转义字符。
如果我使用以下命令,URL将正确输出:
let urlFormString = URL(string:"https://example.com/somePath?")
为什么appendingPathComponent
要将?
转换为%3F
?
如果路径组件包含问号,我如何使用appendingPathComponent
?
7条答案
按热度按时间8dtrkrch1#
URL的通用格式如下:
您必须意识到,
?
不是path
的一部分。它是path
和query
之间的分隔符。如果尝试将
?
添加到路径,则必须对其进行URL编码,因为?
不是路径组件的有效字符。最好的解决方案是从
path
中删除?
。在那里它没有任何意义。但是,如果您有要追加到基本URL的部分URL,则应将它们作为字符串联接:简而言之,
appendingPathComponent
不是应该用于追加URL查询的函数。zbsbpyhn2#
您应该在URL的
absoluteString
上使用removingPercentEncoding
,e1xvtsh33#
根据URL编码,
%3F
代表?
。因此,如果你创建一个URL--它必须是这样的。如果出于某种原因,您需要?
,请创建一个字符串,而不是URL。检查
urlWithPath.lastPathComponent
以查看是否一切正常(打印:“omePath?”)uxhixvfz4#
首先,这不是一个问题。这是一种称为URL编码的机制,用于将不可打印或特殊的字符转换为Web服务器和浏览器普遍接受的格式。
有关更多信息,请访问https://www.techopedia.com/definition/10346/url-encoding
URL编码字符,https://www.degraeve.com/reference/urlencoding.php
olmpazwi5#
当您将字符串转换为URL时,它将在URL中执行PercentEnding。因此,您的
?
已被编码为%3F
。如果您希望URL为包含
?
的字符串,您可以删除PercentEnding,如下所示。let urlString = urlWithPath?.absoluteString.removingPercentEncoding
Output: https://example.com/somePath?
5uzkadbs6#
您可以使用
NSString
类构建您的URL:这样,特殊字符就不会在最终的URL中进行URL编码。
ar7v8xwq7#
可以使用URLComponents而不是URL:
设置方案、主机、路径:
将查询设置为空字符串和?是添加的,因为它是路径和查询之间的分隔符:
打印:
https://example.com/somePath?