Open1
[Swift] `URLQueryItem`が`+`をエンコードしてくれなくて困った話
let query = "a+b c"
var urlComponents = URLComponents(string: "https://example.com")
urlComponents?.queryItems = [URLQueryItem(name: "q", value: query)]
var urlString = urlComponents?.url!.absoluteString
// => "https://example.com?q=a+b%20c"
+
は
- 値としての
+
- パーセントエンコード後のスペース(
%20
の省略表記)
の両方を表すので、誤爆を防ぐために排除されているのかな?
(ちなみに+
をパーセントエンコードすると%2B
)
自力でパース
let query = "a+b c"
let encodedQuery = query.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed.subtracting(.init(charactersIn: "+")))!
var urlString = URL(string: "https://example.com?q=\(encodedQuery)")!.absoluteString
// => "https://example.com?q=a%2Bb%20c"