URL 인코딩·디코딩
주소나 쿼리 값을 붙여 넣으면 바로 퍼센트 인코딩하거나 디코딩합니다.
입력값은 브라우저 밖으로 나가지 않음RFC 3986WHATWG URL기준일 2026.10.14
입력
출력
URL 인코딩·디코딩 사용 방법
- 1입력 칸에 주소나 글을 붙여 넣거나 「예시 넣기」를 누릅니다.
- 2방향(인코딩·디코딩), 범위(구성 요소·전체 URL·폼), 문자 인코딩을 고르면 결과가 바로 바뀝니다.
- 3「복사」로 결과를 복사하거나 「내려받기」로 .txt 파일을 저장합니다. 「바꾸기」는 결과를 입력으로 옮기고 방향을 뒤집습니다.
URL 인코딩·디코딩 옵션
- 방향
- 인코딩은 글자를 %XX로 바꾸고, 디코딩은 %XX를 글자로 되돌립니다. 기본은 인코딩입니다. 「바꾸기」를 누르면 결과가 입력으로 옮겨지고 방향이 뒤집힙니다.
- 범위
- 구성 요소(기본)는 encodeURIComponent처럼 값 하나를 통째로 인코딩해 / ? & = 도 바꿉니다. 전체 URL은 encodeURI처럼 주소의 구분자를 그대로 둡니다. 폼은 application/x-www-form-urlencoded 규칙으로 공백을 +로 적고, 디코딩할 때 +를 공백으로 읽습니다.
- 문자 인코딩
- UTF-8(기본), EUC-KR(CP949), Shift_JIS(CP932) 가운데 고릅니다. 뒤의 둘은 주소에 UTF-8을 쓰지 않는 오래된 한국·일본 시스템용입니다.
- URL 분해 표
- 입력이 https:// 같은 스킴으로 시작하는 주소 전체이면 프로토콜·호스트·경로와 쿼리의 키·값을 디코딩한 값으로 표에 보여 줍니다. 기본은 켬입니다.
퍼센트 인코딩과 이 도구의 동작
주소에는 정해진 ASCII 글자만 쓸 수 있습니다. 그 밖의 글자는 바이트마다 %와 16진수 두 자리로 적는데, 이 규칙이 RFC 3986의 퍼센트 인코딩입니다. 이 도구는 JavaScript의 encodeURIComponent·encodeURI와 같은 결과를 냅니다. 구성 요소 범위에서는 영문자·숫자와 - _ . ! ~ * ' ( )만 그대로 두고, 전체 URL 범위에서는 ; / ? : @ & = + $ , #도 남깁니다.
폼 범위는 WHATWG URL 표준의 application/x-www-form-urlencoded 규칙을 따릅니다. 영문자·숫자와 * - . _만 남기고 공백은 +로 적습니다.
전체 URL 범위로 디코딩할 때는 %2F·%3F처럼 구분자를 나타내는 이스케이프를 풀지 않고 적힌 그대로 둡니다. decodeURI와 같은 동작이며, 디코딩해도 주소의 구조가 바뀌지 않습니다.
URL 퍼센트 인코딩 표 (예약·특수 문자)
자주 쓰는 문자를 UTF-8로 퍼센트 인코딩한 값입니다. 쉼표 ,는 %2C, 슬래시 /는 %2F, 공백은 %20입니다. 구성 요소·전체 URL·폼 칸은 범위마다 이 도구가 그 문자를 어떻게 바꾸는지 보여 주며, 「그대로」는 인코딩하지 않고 남긴다는 뜻입니다.
16진수는 대소문자를 가리지 않아 %2c와 %2C는 같은 바이트입니다. 이 도구는 RFC 3986의 권고대로 대문자로 적습니다.
| 문자 | 퍼센트 인코딩 | 구성 요소encodeURIComponent | 전체 URLencodeURI | 폼 | 의미·주의점 |
|---|---|---|---|---|---|
| 줄바꿈(LF) | %0A | %0A | %0A | %0A | 여러 줄 텍스트의 줄바꿈 |
| 공백 | %20 | %20 | %20 | + | 폼 데이터에서는 +로 적는다 |
! | %21 | 그대로 | 그대로 | %21 | 예약 문자(하위 구분자) |
" | %22 | %22 | %22 | %22 | 주소에 그대로 쓸 수 없는 문자 |
# | %23 | %23 | 그대로 | %23 | 프래그먼트(# 뒤 부분)의 시작 |
$ | %24 | %24 | 그대로 | %24 | 예약 문자(하위 구분자) |
% | %25 | %25 | %25 | %25 | 이스케이프의 시작이라 % 자체는 항상 인코딩한다 |
& | %26 | %26 | 그대로 | %26 | 쿼리 매개변수 구분 |
' | %27 | 그대로 | 그대로 | %27 | 예약 문자(하위 구분자) |
( | %28 | 그대로 | 그대로 | %28 | 예약 문자(하위 구분자) |
) | %29 | 그대로 | 그대로 | %29 | 예약 문자(하위 구분자) |
* | %2A | 그대로 | 그대로 | 그대로 | 예약 문자(하위 구분자) |
+ | %2B | %2B | 그대로 | %2B | 폼 데이터에서는 공백을 뜻하므로 + 자체는 인코딩해야 한다 |
, | %2C | %2C | 그대로 | %2C | 예약 문자(하위 구분자). 목록 값 구분에 자주 쓴다 |
/ | %2F | %2F | 그대로 | %2F | 경로 구분 |
: | %3A | %3A | 그대로 | %3A | 스킴 끝·포트 앞에 쓴다 |
; | %3B | %3B | 그대로 | %3B | 예약 문자(하위 구분자) |
< | %3C | %3C | %3C | %3C | 주소에 그대로 쓸 수 없는 문자 |
= | %3D | %3D | 그대로 | %3D | 쿼리 키와 값 구분 |
> | %3E | %3E | %3E | %3E | 주소에 그대로 쓸 수 없는 문자 |
? | %3F | %3F | 그대로 | %3F | 쿼리 문자열의 시작 |
@ | %40 | %40 | 그대로 | %40 | 사용자 정보와 호스트 구분 |
[ | %5B | %5B | %5B | %5B | 호스트의 IPv6 주소를 감싼다 |
\ | %5C | %5C | %5C | %5C | 주소에 그대로 쓸 수 없는 문자. 브라우저는 http·https 주소에서 /로 읽는다 |
] | %5D | %5D | %5D | %5D | 호스트의 IPv6 주소를 감싼다 |
^ | %5E | %5E | %5E | %5E | 주소에 그대로 쓸 수 없는 문자 |
` | %60 | %60 | %60 | %60 | 주소에 그대로 쓸 수 없는 문자 |
{ | %7B | %7B | %7B | %7B | 주소에 그대로 쓸 수 없는 문자 |
| | %7C | %7C | %7C | %7C | 주소에 그대로 쓸 수 없는 문자 |
} | %7D | %7D | %7D | %7D | 주소에 그대로 쓸 수 없는 문자 |
~ | %7E | 그대로 | 그대로 | %7E | 비예약 문자. 폼 데이터에서만 인코딩한다 |
한 | %ED%95%9C | %ED%95%9C | %ED%95%9C | %ED%95%9C | 한글 한 글자는 UTF-8로 3바이트. EUC-KR로는 %C7%D1 |
한글 주소와 EUC-KR
퍼센트 인코딩된 글자의 바이트는 문자 인코딩에 따라 달라집니다. 제는 UTF-8에서 %EC%A0%9C, EUC-KR에서 %C1%A6입니다. 지금은 거의 모든 곳이 UTF-8을 쓰지만 오래된 한국·일본 시스템의 주소에는 EUC-KR이나 Shift_JIS가 남아 있습니다. 여기서 EUC-KR은 CP949, Shift_JIS는 CP932를 뜻하며, 브라우저가 쓰는 WHATWG Encoding 표준과 같은 기준입니다.
이 인코딩에서는 글자의 둘째 바이트가 ASCII 글자일 수 있습니다. 예를 들어 똠은 EUC-KR에서 두 바이트 8C 63이고 %8Cc로 적힙니다. 디코딩할 때 이런 시퀀스도 올바르게 읽습니다.
URL 인코딩·디코딩 예시
쿼리 값 인코딩 (기본 옵션: 인코딩, 구성 요소, UTF-8)
값 안의 &와 =도 인코딩되어 쿼리 구분자와 섞이지 않습니다.
입력
제킬로 dev&tools=1
출력
%EC%A0%9C%ED%82%AC%EB%A1%9C%20dev%26tools%3D1
주소 전체 인코딩 (범위: 전체 URL)
://, /, ?, = 같은 구분자는 그대로 두고 한글과 공백만 바꿉니다.
입력
https://zekilo.com/ko/검색?q=a b
출력
https://zekilo.com/ko/%EA%B2%80%EC%83%89?q=a%20b
폼 인코딩 (범위: 폼)
공백이 +가 됩니다.
입력
a b&c=제
출력
a+b%26c%3D%EC%A0%9C
EUC-KR로 인코딩 (문자 인코딩: EUC-KR)
같은 글자가 UTF-8에서는 %EC%A0%9C%ED%82%AC%EB%A1%9C입니다.
입력
제킬로
출력
%C1%A6%C5%B3%B7%CE
바뀌지 않는 기호 (구성 요소)
입력
!'()*~
출력
!'()*~
끊긴 시퀀스 (방향: 디코딩)
오류와 함께 끊긴 시퀀스가 시작하는 위치(1줄 1열)를 알려 줍니다.
입력
%E0%A4%A
출력
E_URI_MALFORMED
예시는 이 도구를 검증하는 기준 사례의 값입니다.
URL 인코딩·디코딩 자주 묻는 질문
입력값이 서버로 전송되나요?
아니요. 입력과 결과는 이 브라우저 안에서만 처리되며 저장하지도 않습니다. 새로 고침하면 사라집니다.
구성 요소와 전체 URL은 무엇이 다른가요?
구성 요소는 입력을 값 하나로 보기 때문에 / ? & = # 처럼 주소에서 뜻이 있는 글자도 인코딩합니다. 쿼리 값 하나나 경로 한 토막을 만들 때 씁니다. 전체 URL은 입력을 주소 전체로 보고 그 구분자를 남겨 두어, 결과도 그대로 열리는 주소가 됩니다.
공백이 %20이 될 때와 +가 될 때는 언제인가요?
구성 요소와 전체 URL 범위에서는 %20이 됩니다. 폼 범위에서는 +가 되는데, HTML 폼과 대부분의 쿼리 문자열이 이렇게 적습니다. 디코딩할 때 +를 공백으로 읽는 것도 폼 범위뿐입니다.
%B0%CB%BB%F6처럼 디코딩하면 깨지는 주소는 어떻게 읽나요?
UTF-8이 아니라 EUC-KR로 인코딩된 주소일 가능성이 큽니다. 방향을 디코딩으로 두고 문자 인코딩을 EUC-KR(CP949)로 바꿔 보세요. 오래된 일본 사이트의 주소라면 Shift_JIS(CP932)를 고릅니다.
「잘못된 퍼센트 인코딩」 오류는 왜 나오나요?
% 뒤에는 16진수 두 자리가 와야 하고, 풀어 낸 바이트가 고른 문자 인코딩에서 올바른 글자여야 합니다. 오류에는 끊긴 시퀀스가 시작하는 줄과 열이 함께 나옵니다. 복사하다가 글이 잘렸을 때 흔히 생깁니다.
EUC-KR이나 Shift_JIS로 표현할 수 없는 글자는 어떻게 되나요?
그런 글자가 몇 개인지 안내가 나오고, 글자마다 😀 같은 숫자 참조를 퍼센트 인코딩한 꼴로 적습니다. 브라우저가 레거시 인코딩 페이지에서 폼을 보낼 때와 같은 방식입니다.
관련 도구
처리 방식·표준
- 처리 위치: 이 브라우저 (내 기기). 전송하거나 저장하지 않습니다.
- 표준: RFC 3986 · WHATWG URL
- 엔진: ZEKILO Dev URL 인코더·디코더 (자체 구현) · EUC-KR·Shift_JIS 인코딩 표 (WHATWG Encoding index 기반) (BSD 3-Clause (WHATWG))
- 레거시 인코딩은 브라우저의 TextDecoder로 디코딩하고, WHATWG Encoding index로 만든 표로 인코딩합니다.
- 짝 없는 대리 문자는 U+FFFD(%EF%BF%BD)로 인코딩합니다.
- 빈 입력은 오류가 아닙니다. 출력이 비어 있을 뿐입니다.
- 기준일 2026.10.14
- 변경 이력: 2026.10.14 자주 쓰는 문자의 퍼센트 인코딩 표 추가
- 변경 이력: 2026.10.03 처음 공개