Open1

[Swift] `URLQueryItem`が`+`をエンコードしてくれなくて困った話

kntkymtkntkymt
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

https://developer.mozilla.org/en-US/docs/Glossary/Percent-encoding

自力でパース

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"