如果我像这样编码一个字符串:
var escapedString = originalString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
它不能逃脱斜杠/
。
我搜索并找到了这个目标C代码:
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8 );
是否有一种更简单的方式来编码一个URL,如果不是,我如何用Swift写这个呢?
发布于 2014-07-03 11:05:01
Swift 3
在Swift 3中有addingPercentEncoding
let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)
输出:
测试%2 2Ftest
Swift 1
在iOS 7及以上版本中,有stringByAddingPercentEncodingWithAllowedCharacters
var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")
输出:
测试%2 2Ftest
以下是有用的(倒排)字符集:
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
如果要转义一组不同的字符,请创建一组:
添加"=“字符的示例:
var originalString = "test/test=42"
var customAllowedSet = NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")
输出:
测试%2 2Ftest%3D42
示例以验证非集合中的ascii字符:
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)\'")
}
发布于 2017-04-27 21:27:38
您可以使用URLComponents来避免手动编码查询字符串的百分比:
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"
}
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
}
}
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
}
发布于 2018-03-12 08:56:23
Swift 4&5
要在URL中编码参数,我发现使用.alphanumerics
字符集是最简单的选项:
let urlEncoded = value.addingPercentEncoding(withAllowedCharacters: .alphanumerics)
let url = "http://www.example.com/?name=\(urlEncoded!)"
使用任何用于URL编码的标准字符集(如.urlQueryAllowed
或.urlHostAllowed
)都不起作用,因为它们不排除=
或&
字符。
注意到,通过使用.alphanumerics
,它将编码一些不需要编码的字符(比如-
、.
、_
或~
--参见2.3 )。RFC 3986中的无保留字符)。我发现使用.alphanumerics
比构建自定义字符集更简单,并且不介意要编码的其他字符。如果这让您感到困扰,请按照如何对URL字符串进行百分比编码中的描述构造一个自定义字符集,例如:
// 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 { ... }
。
https://stackoverflow.com/questions/24551816
复制相似问题