The framework ought to provide a straightforward way of doing this.
I do agree, but as far as I know, Apple does not provide one we need.
As you see, `URLQueryAllowedCharacterSet` contains `+`, `&` and `=`, which means they are not escaped so servers may not properly decode the query params when such characters included.
Currently I use my own CharacterSet when constructing URL with query params.
extension CharacterSet {
static let rfc3986Unreserved = CharacterSet(charactersIn:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~")
}
Some servers (not many) do not accept `%20` for space character and only accept `+`, in such cases, `stringByAddingPercentEncodingWithAllowedCharacters` does not work and I need to use something like this:
extension String {
func addingPercentEncoding(withAllowedCharacters characterSet: CharacterSet, using encoding: String.Encoding) -> String {
let stringData = self.data(using: encoding, allowLossyConversion: true) ?? Data()
let percentEscaped = stringData.map {byte->String in
if characterSet.contains(UnicodeScalar(byte)) {
return String(UnicodeScalar(byte))
} else if byte == UInt8(ascii: " ") {
return "+"
} else {
return String(format: "%%%02X", byte)
}
}.joined()
return percentEscaped
}
}
(I'm not sure you prefer Swift or not, but you understand that we need to do it by ourselves.)
Anyway, what is right depends on servers and no predefined `NSCharacterSet` are right for most servers.