EllyTools

이미지 도구

계산기

텍스트 도구

색상 도구

파일 도구

유틸리티

URL 인코더/디코더

URL 특수문자 인코딩·디코딩

사용 방법

1

인코딩이 필요한 URL이나 쿼리 파라미터를 붙여넣으세요

2

인코딩(원문 → %xx) 또는 디코딩(%xx → 원문)을 선택하세요

3

결과를 복사해 코드에 사용하거나 안전하게 공유하세요

자주 묻는 질문

관련 도구

누구를 위한 도구인가요?

  • 공백·한글·특수문자가 있는 URL을 디버깅하는 개발자
  • 퍼센트 인코딩된 데이터가 포함된 서버 로그를 읽는 QA 엔지니어
  • 이메일·채팅·쿼리 파라미터용으로 URL을 준비하는 모든 사람

URL 인코딩 — 한글 주소가 %EA%B2%80 로 변하는 이유

주소창에 넣을 수 있는 글자는 정해져 있습니다. 영문, 숫자, 그리고 몇 개의 기호뿐입니다. 한글도 공백도 그 목록에 없어서, 실어 보내려면 허용된 글자로 바꿔야 합니다. 그 규칙이 퍼센트 인코딩입니다.

네이버 블로그 글 주소를 복사해서 카카오톡에 붙여넣으면 멀쩡히 열립니다. 그런데 같은 주소를 코드에 적거나 문서에 넣으면 링크가 중간에서 끊깁니다. 브라우저가 화면에 보여줄 때는 사람이 읽기 좋으라고 한글을 그대로 그려 주지만, 실제로 서버에 보내는 주소는 다르게 생겼기 때문입니다. 주소창의 주소를 클릭해서 복사해 보면 그 진짜 모습이 나옵니다.

퍼센트 인코딩은 허용되지 않은 글자를 그 글자의 바이트값 앞에 %를 붙인 형태로 바꾸는 규칙입니다. 공백은 %20, 물음표는 %3F가 됩니다. 되돌리는 것도 같은 규칙을 거꾸로 적용하면 되기 때문에 정보가 사라지지는 않습니다.

한글 한 글자가 왜 세 덩어리가 되나

퍼센트 인코딩은 글자가 아니라 바이트를 옮깁니다. 그래서 먼저 글자를 바이트로 바꿔야 하고, 오늘날의 웹은 그 일을 UTF-8로 합니다.

UTF-8에서 영문 한 글자는 1바이트지만 한글 한 글자는 3바이트입니다. '한'은 237, 149, 156 세 바이트고, 이 값을 16진수로 적으면 ED, 95, 9C입니다. 각각 앞에 %를 붙이면 %ED%95%9C가 됩니다. 한글 두 글자짜리 '검색'이 %EA%B2%80%EC%83%89처럼 여섯 덩어리가 되는 것도 같은 이유입니다.

그래서 인코딩된 주소에서 %가 세 개씩 묶여 나오면 한글이나 이모지, %가 하나만 있고 뒤에 2나 3으로 시작하는 값이 오면 공백이나 기호라고 대충 짐작할 수 있습니다.

'주소 전체'와 '값 하나'는 다른 일을 합니다

이 도구에 버튼이 두 개인 이유는 인코딩이 두 종류라서가 아니라, 붙여넣는 것이 두 종류라서입니다.

주소를 통째로 붙여넣었다면 ://와 ?와 &는 주소의 뼈대입니다. 이것까지 바꿔 버리면 인코딩은 맞아도 더 이상 주소가 아닙니다. '주소 전체'는 뼈대를 남기고 한글과 공백만 바꿉니다.

반대로 쿼리에 넣을 값 하나를 다룰 때는 뼈대를 남기면 안 됩니다. 검색어가 'A&B'인데 &를 그대로 두면 서버는 거기서 파라미터가 하나 더 시작한다고 읽습니다. 검색어는 'A'가 되고 'B'라는 정체불명의 파라미터가 생깁니다. '값 하나'는 구분자까지 전부 바꿔서 이 사고를 막습니다.

같은 글자, 다른 결과

두 모드가 실제로 어디서 갈라지는지 보여 주는 표입니다.

입력한 글자주소 전체값 하나
공백%20%20
한글 '한'%ED%95%9C%ED%95%9C
: (콜론)그대로 :%3A
/ (슬래시)그대로 /%2F
? (물음표)그대로 ?%3F
& (앰퍼샌드)그대로 &%26
= (등호)그대로 =%3D
# (샵)그대로 #%23
% (퍼센트)%25%25

한글 도메인은 퍼센트 인코딩을 쓰지 않습니다

주소 중에서 도메인 이름만은 규칙이 다릅니다. 경로와 쿼리는 퍼센트 인코딩을 쓰지만, 도메인은 퓨니코드라는 별도의 방식으로 xn--으로 시작하는 영문 이름으로 바뀝니다.

예를 들어 한글도메인.kr은 xn--bj0bj3i97fq8o5lq.kr이 됩니다. 이것을 퍼센트 인코딩으로 바꾸면 형식은 그럴듯해 보여도 브라우저가 그런 도메인을 찾지 못해 주소가 열리지 않습니다. 이 도구는 '주소 전체' 모드에서 도메인 부분을 알아서 퓨니코드로 바꾸고 나머지만 퍼센트 인코딩합니다. 결과는 브라우저가 실제로 서버에 보내는 주소와 같습니다.

+ 가 공백일 때와 아닐 때

인코딩된 주소에서 공백이 %20이 아니라 +로 보이는 경우가 있습니다. 이것은 폼을 제출할 때 쓰는 별도의 규칙(application/x-www-form-urlencoded)이고, 검색창에 입력한 값이 주소로 넘어갈 때 흔히 이 형태가 됩니다.

문제는 경로 안에 있는 +는 진짜 더하기 기호라는 점입니다. 그래서 +를 무조건 공백으로 바꾸는 도구도, 무조건 그대로 두는 도구도 절반은 틀립니다. 이 도구는 디코딩할 때 입력에 +가 있고 두 해석이 다르면 양쪽 결과를 함께 보여 줍니다. 검색어나 폼에서 온 값이면 공백 쪽, 파일 이름이나 경로면 그대로인 쪽입니다.

자주 겪는 실수

  • 이미 인코딩된 주소를 한 번 더 인코딩 — %ED가 %25ED가 되고 링크는 아무 데도 가지 않습니다. 입력에 %xx가 이미 있으면 이 도구가 알려 줍니다.
  • 주소 전체를 '값 하나'로 인코딩 — 형식은 맞지만 주소로 쓸 수 없는 긴 문자열이 나옵니다.
  • 값에 & 를 그대로 두기 — 값이 거기서 잘리고 뒤가 별개 파라미터로 읽힙니다.
  • '50% 할인' 같은 문구를 그대로 디코딩 — % 뒤에 16진수 두 자리가 없어서 오류가 납니다. 이 문구를 주소에 넣으려면 %25로 바꿔야 합니다.
  • 인코딩된 주소를 눈으로 읽고 판단하기 — %EA%B2%80 이 무슨 글자인지는 디코딩해 봐야 압니다.

자주 묻는 질문

브라우저 주소창에는 한글이 그대로 보이는데요?

보여 주기만 그렇게 합니다. 주소를 클릭해서 복사하면 퍼센트 인코딩된 진짜 주소가 나옵니다. 서버에 오가는 것은 항상 인코딩된 쪽입니다.

%20 과 + 중 무엇을 써야 하나요?

경로에는 %20을 써야 합니다. 쿼리 문자열에서는 둘 다 공백으로 해석되는 것이 보통이지만, 확실하게 하려면 %20이 안전합니다.

디코딩했더니 글자가 깨져 나옵니다.

UTF-8이 아닌 인코딩(EUC-KR 등)으로 만들어진 오래된 주소일 수 있습니다. %BF%B9처럼 한글인데 세 덩어리가 아니라 두 덩어리씩 묶여 있으면 그런 경우입니다.

붙여넣은 주소가 저장되나요?

아니요. 변환은 전부 브라우저 안에서 일어나고 입력한 값은 어디로도 전송되지 않습니다.