[Swift] URL Encoding을 위한 CharacterSet 살펴보기
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=repositoriesurlFragmentAllowed
https://github.com/sujinnaljin?tab=repositoriesurlHostAllowed
https%3A%2F%2Fgithub.com%2Fsujinnaljin%3Ftab=repositoriesurlPathAllowed
https%3A//github.com/sujinnaljin%3Ftab=repositoriesurlPasswordAllowed
https%3A%2F%2Fgithub.com%2Fsujinnaljin%3Ftab=repositoriesurlUserAllowed
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
(굵은 글씨)