URL에는 쓸 수 있는 문자가 정해져 있습니다. 그 밖의 문자는 UTF-8 바이트로 바꾼 뒤 각 바이트를 퍼센트와 16진수 두 자리로 적습니다. 공백은 %20이 되고 한글 한 글자는 3바이트라 %EA%B3%84처럼 아홉 글자가 됩니다.
이 계산기는 주소 전체를 다룰 때와 값 하나만 다룰 때를 구분합니다. 주소 전체라면 슬래시나 물음표처럼 구조를 이루는 기호는 남겨 둬야 하고, 검색어 같은 값 하나라면 그 기호들까지 전부 인코딩해야 파라미터가 쪼개지지 않습니다.
디코딩은 반대 방향입니다. %로 시작하는 세 글자 묶음을 바이트로 되돌린 뒤 UTF-8로 읽습니다. 로그나 리퍼러에 남은 주소에서 원래 검색어를 확인할 때 주로 씁니다.
인코딩 범위를 잘못 잡을 때
값 하나를 주소 전체 기준으로 인코딩하면 파라미터가 끊깁니다. 검색어에 앰퍼샌드가 들어 있는데 그대로 두면 서버는 거기서부터 다른 파라미터가 시작한다고 읽습니다. 쿼리 값에는 값 기준 인코딩을 쓰세요.
반대로 주소 전체를 값 기준으로 인코딩하면 슬래시와 콜론까지 바뀌어 링크가 열리지 않습니다. 이미 완성된 URL을 다른 URL의 파라미터로 실어 보낼 때는 값 기준이 맞지만, 그대로 주소창에 넣을 것이라면 틀립니다.
이미 인코딩된 문자열을 한 번 더 인코딩하면 퍼센트 기호 자체가 %25로 바뀌어 두 겹이 됩니다. 결과에 %25가 여럿 보인다면 대개 이 경우이고, 디코딩을 두 번 해야 원문이 나옵니다.
자주 묻는 질문
쿼리 값으로 처리를 끄면 뭐가 달라지나요?
켜면 encodeURIComponent, 끄면 encodeURI로 동작합니다. 차이는 : / ? # [ ] @ 같은 구분 문자를 변환하느냐입니다. 주소 전체를 인코딩할 때는 꺼야 슬래시가 살아 있고, 쿼리 파라미터 값 하나를 넣을 때는 켜야 값 안의 &가 파라미터 구분자로 오해되지 않습니다.
한글 주소가 왜 이렇게 길어지나요?
UTF-8에서 한글 한 글자는 3바이트이고, 퍼센트 인코딩은 1바이트를 %XX 세 글자로 바꿉니다. 그래서 한글 한 글자가 아홉 글자가 됩니다. '검색'은 %EA%B2%80%EC%83%89이 됩니다.
공백이 + 가 되나요 %20 이 되나요?
둘 다 쓰입니다. 폼 전송(application/x-www-form-urlencoded)에서는 +, 일반 URL 경로에서는 %20입니다. 이 도구는 %20을 씁니다. 서버가 + 를 공백으로 해석하는지는 구현에 따라 다릅니다.
계산은 이 브라우저에서 이루어집니다. 결과를 그대로 쓰기 전에 넣은 값을 한 번 확인하세요.