[Swift] URL Encoding을 위한 CharacterSet 살펴보기

urlQueryAllowed 외에도 가능한 URL 인코딩 옵션을 알아봅시다

naljin
8 min readApr 26, 2021

TL; DR;

addingPercentEncoding(withAllowedCharacters:) 함수를 이용해서 String을 인코딩할 수 있습니다.

url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

이때 인자로 들어갈 수 있는 CharacterSet 중에, URL Encoding을 위한 것은 6가지가 있습니다. 우리는 웬만하면 urlQueryAllowed 를 사용하도록 합시다.

https://github.com/sujinnaljin?tab=repositoriesurlQueryAllowed
https://github.com/sujinnaljin?tab=repositories
urlFragmentAllowed
https://github.com/sujinnaljin?tab=repositories
urlHostAllowed
https%3A%2F%2Fgithub.com%2Fsujinnaljin%3Ftab=repositories
urlPathAllowed
https%3A//github.com/sujinnaljin%3Ftab=repositories
urlPasswordAllowed
https%3A%2F%2Fgithub.com%2Fsujinnaljin%3Ftab=repositories
urlUserAllowed
https%3A%2F%2Fgithub.com%2Fsujinnaljin%3Ftab=repositories%

들어가기 전에

https://github.com/sujinnaljin?tab=repositories (으로 생각했던) 요청에서 404가 떴다. 으엥?? url 부터 찍어보자...

https%3A%2F%2Fgithub.com%2Fsujinnaljin%3Ftab=repositories

무언가 잘못되었군..! ㅎㅎ 내가 인코딩을 어떻게 했더라..

url.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

흠,, .urlHostAllowed 때문이구만? 근데 이게 뭐길래 결과가 이렇게까지 달라지는건데..???

지금부터 알아봅시다 ㄱㄱ

addingPercentEncoding(withAllowedCharacters:)

일단 addingPercentEncoding(withAllowedCharacters:) 정의부터 보자

인자로 받은 Set을 제외한 모든 character를 퍼센트 인코딩된 character로 대체하여 새 문자열을 반환합니다.

오.. 그러니까 withAllowedCharacters 로 넘기는 CharacterSet인코딩 과정에서 변경되지 않을 것들이네?

그럼 각각의 CharacterSet 은 정확히 어떤 것들을 포함하는지 찾아보면 되겠군

URLEncoding CharacterSet

여기 코드를 참고해서 CharacterSet프린트했고, 그 중 알파벳과 숫자 (0~9) 를 제외했더니 아래와 같은 결과가 나왔다

urlUserAllowed (15개)

! $ & \ ( ) * + , - . ; = _ ~

urlPasswordAllowed (15개)

! $ & \ ( ) * +  - . ; = _ ~

urlUserAllowed와 같다.

urlPathAllowed (17개)

! $ & \ ( ) * +  - . / : = @ _ ~

urlUserAllowed에 비해 ;가 없고 / : @ 가 더 있다.

urlHostAllowed (18개)

! $ & \ ( ) * +  - . : ; = [ ] _ ~

urlUserAllowed에 비해 : [ ] 가 더 있다.

urlFragmentAllowed (19개)

! $ & \ ( ) * +  - . / : ; = ? @ _ ~

urlUserAllowed에 비해 / : ? @ 가 더 있다.

urlQueryAllowed (19개)

! $ & \ ( ) * +  - . / : ; = ? @ _ ~

urlFragmentAllowed와 같다

오호,, 위에서 명시한 각각의 CharacterSet은 제외하고 percent encoding 을 한다는 말이군!!!

내가 처음에 썼던 urlHostAllowed 에 해당하는 CharacterSet:, / , ?을 포함하지 않으니까 퍼센트 인코딩 되어서 %3A , %2F, %3F 로 변환된거구.. 가릿가릿

사실 여기까지 읽었으면 ㅇㅋㅇㅋ!

보오너스

위에서 봤듯 URLEncoding CharacterSet은 이름들이 urlSomthingAllowed 형식이답.

apple 문서를 각각 들여다보면 “Something Url component에서 허용되는 character에 대한 character set을 반환” 으로 정의되어 있고, Something component 가 무엇인지 예를 들어준다.

아래는 그냥 해석본이니까 읽어볼 사람은 읽어보자리

urlQueryAllowed

  • query URL component에서 허용되는 character에 대한 character set을 반환
  • query component: ? 바로 뒤에 오는 component
  • http://www.example.com/index.php?key1=value1#jumpLink (굵은 글씨)

urlFragmentAllowed

  • fragment URL component에서 허용되는 character에 대한 character set을 반환
  • fragment component: # 뒤에 나타나는 것
  • http://www.example.com/index.html#jumpLocation (굵은 글씨)

urlHostAllowed

  • host URL subcomponent에서 허용되는 character에 대한 character set을 반환
  • host component: 일반적으로 처음 두 개의 슬래시 (//) 바로 뒤의 component
  • 만약 URL에 사용자 이름과 암호가 포함 되어있다면, host component는 @부호 뒤의 component
  • http://username:password@www.example.com/index.html (굵은 글씨)

urlPathAllowed

  • path URL component에서 허용되는 character에 대한 character set을 반환
  • path component: host component (있는 경우) 의 바로 다음 component. query component 또는 fragment component 까지 적용됨.
  • http://www.example.com/index.php?key1=value1 (굵은 글씨)

urlUserAllowed

  • user URL component에서 허용되는 character에 대한 character set을 반환
  • user component: host component 앞에 오는 optional component. : (암호가 지정된 경우) 또는 @기호 (암호가 지정되지 않은 경우 )로 끝남.
  • http://username:password@www.example.com/index.html (굵은 글씨)

urlPasswordAllowed

  • password URL subcomponent에서 허용되는 character에 대한 character set을 반환
  • password component: URL에서 username component 뒤에 있는 : 뒤의 component. @기호로 끝남.
  • http://username:password@www.example.com/index.html (굵은 글씨)

참고

--

--

No responses yet