값 하나인가, 주소 전체인가
두 모드의 차이는 &, =, ?, /, #를 건드리느냐입니다.
값 하나는 이 문자들까지 전부 바꿉니다. 검색어나 리다이렉트 주소처럼 파라미터 안에 들어갈 값에 씁니다. 예를 들어 ?next=에 붙일 주소를 이 모드로 바꾸지 않으면, 그 안의 &가 새 파라미터의 시작으로 읽혀 값이 중간에서 잘립니다.
주소 전체는 구조를 이루는 문자를 남겨 둡니다. 이미 완성된 주소에서 공백이나 한글만 정리하고 싶을 때 씁니다. 이 모드로 주소를 통째로 바꾸면 https://의 슬래시까지 그대로 남아 링크가 계속 동작합니다.
헷갈릴 때 기준은 하나입니다. 주소의 일부를 만들고 있으면 값 하나, 이미 주소를 갖고 있으면 주소 전체입니다.
공백은 +인가 %20인가
둘 다 볼 수 있지만 자리가 다릅니다. %20은 주소 어디서나 통하는 표준 표기입니다. +는 HTML 폼이 데이터를 보낼 때 쓰는 옛 규칙이라 쿼리스트링에서만 공백으로 해석됩니다.
경로에 있는 +는 공백이 아니라 그냥 더하기 기호입니다. 그래서 파일 이름에 더하기가 들어간 주소를 폼 규칙으로 디코딩하면 이름이 바뀌어 버립니다. 이 도구는 표준 쪽을 따라 공백을 %20으로 바꿉니다.
두 번 인코딩된 값
디코딩한 결과에 %2520이나 %253A 같은 조각이 남아 있으면 값이 두 번 인코딩된 것입니다. %가 다시 %25로 바뀌면서 생긴 흔적입니다.
대개 이미 인코딩된 값을 코드가 한 번 더 인코딩해서 생깁니다. 한 번 더 디코딩하면 원문이 나오지만, 진짜 해결은 인코딩을 어디서 하는지 정하는 것입니다. 값을 주소에 붙이는 자리에서 한 번만 인코딩하고, 그 앞뒤로는 원문 그대로 넘기세요.
인코딩하지 않아도 되는 문자
A-Z, a-z, 0-9와 -, ., _, ~는 규격이 안전하다고 정해 둔 문자라 그대로 둡니다. 이 도구가 이들을 바꾸지 않는 것은 누락이 아닙니다.
한글 한 글자는 UTF-8에서 3바이트이므로 %EA%B0%80처럼 세 덩어리가 됩니다. 주소가 갑자기 길어 보이는 이유가 이것입니다.