如果我编码这样的字符串:
var escapedString = originalString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
它没有逃脱斜线 /
.
我搜索并找到了这个Objective C代码:
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8 );
是否有更简单的方法来编码URL,如果没有,我如何在Swift中编写它?
11 回答
斯威夫特3:
1. encodingQuery:
result:
2. encodingURL:
result:
斯威夫特4:
它取决于您的服务器遵循的编码规则 .
Apple提供此类方法,但它没有报告它遵循的RCF协议 .
在这个有用的tool之后,你应该保证为你的参数编码这些字符:
$(美元符号)变为%24
&(&符号)变为%26
(加号)成为%2B
,(逗号)变为%2C
:(冒号)变为%3A
; (半结肠)变为%3B
=(等于)变为%3D
? (问号)变为%3F
@(商业A / At)成为%40
换句话说,关于URL编码,您应该遵循RFC 1738 protocol .
And Swift don't cover the encoding of the + char for example ,但它适用于这三个 @ : ? 字符 .
因此,要正确编码每个参数,
.urlHostAllowed
选项是不够的,您还应该添加特殊字符,例如:希望这可以帮助那些疯狂的人搜索这些信息 .
我自己需要这个,所以我编写了一个String扩展,它允许URLEncoding字符串,以及更常见的最终目标,将参数字典转换为“GET”样式URL参数:
请享用!
斯威夫特4
要在URL中编码参数我发现使用
.alphanumerics
字符集是最简单的选项:使用URL编码的任何标准字符集(如
URLQueryAllowedCharacterSet
或URLHostAllowedCharacterSet
)将不起作用,因为它们不排除=
或&
字符 .Note 通过使用
.alphanumerics
,它将编码一些不需要编码的字符(如-
,.
,_
或~
- 参见2.3.RFC 3986中未保留的字符) . 我发现使用.alphanumerics
比构造自定义字符集更简单,并且不介意要编码一些其他字符 . 如果这让您感到困扰,请构建一个自定义字符集,如How to percent encode a URL String中所述,例如:Warning:
encoded
参数强制解包 . 对于无效的unicode字符串,它可能会崩溃 . 见Why is the return value of String.addingPercentEncoding() optional? . 而不是强行展开encoded!
,您可以使用encoded ?? ""
或使用if let encoded = ...
.斯威夫特3
在Swift 3中有
addingPercentEncoding
输出:
斯威夫特1
在iOS 7及更高版本中有
stringByAddingPercentEncodingWithAllowedCharacters
输出:
以下是有用(反向)字符集:
如果要转义不同的字符集,请创建一个集合:
添加"="字符的示例:
输出:
验证不在集合中的ascii字符的示例:
这个适合我 .
我从这个链接找到了上面的功能:http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/ .
一切都是一样的
斯威夫特3:
Swift 4 (not tested - please comment if it works or not. Thanks @sumizome for suggestion)
Swift 3
Swift 2.2 (从Zaph借用并更正url查询键和参数值)
Example:
这是一个较短版本的Bryan Chen 's answer. I' d猜测
urlQueryAllowed
允许控制字符通过哪个很好,除非它们构成查询字符串中的键或值的一部分,此时它们需要被转义 .这在Swift 4.2中对我有用 . 用例是从剪贴板或类似的URL获取一个URL,该URL可能已经有转义字符,但也包含可能导致
URL(string:)
失败的Unicode字符 .最后
url
的值:https://www.example.com/%ED%8F%B4%EB%8D%94/search?q=123&foo=bar&multi=eggs+and+ham&hangul=%ED%95%9C%EA%B8%80&spaced=lovely%20spam&illegal=%3C%3E
请注意,保留
%20
和+
间距,对Unicode字符进行编码,并且原始urlText
中的%20
不进行双重编码 .Caveat: 这是一个快捷方式,因为它在整个URL上使用
.urlQueryAllowed
;它还假设URL已在浏览器中运行 . 明智地使用!我也愿意接受建议(我没有用URLComponents
斩断整个网址,应用单个字符集,并重新组装) .您可以使用URLComponents来避免手动百分比转义查询字符串: