특수문자, 한글 등을 url로 표현할 때, URI 규약(RFC3986) 에서 문제없이 표현하는 목적

변환해야 하는 문자의 16진수값 앞에 퍼센트를 붙임

특수문자(변환해야 하는 문자)로 보는 범위가 Host, Path, Query 에 따라 살짝 달라짐

Host의 경우 ?도 특수문자에 포함되므로 인코딩되어야 함

extension String {
  func urlEncode() -> String? {
    return self.addingPercentEncoding(withAllowedCharacters: CharacterSet(charactersIn: "!*'();:@&=+$/?%#[]{}").inverted)
  }
  
  func urlDecode() -> String? {
    return self.removingPercentEncoding
  }
}

한번 인코딩한 URL을 다시 인코딩하면 안됨. 인코딩한 상태로 다시 인코딩됨

왜 allowedCharacters에 (기본 지원이 아니라) 저렇게 수동으로 문자를 넣어야 할까? 조금 자세한 조사가 더 필요함