如果我像这样编码一个字符串:
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
复制相似问题