블로그 글 링크를 복사해서 메신저에 붙여넣었더니 한글 부분이 %EC%95%88%EB%85%95으로 바뀌어 있다. 상대방이 보기에 이상한 링크처럼 보일 수 있고, 반대로 이런 문자열을 받았을 때 원래 한글이 뭔지 알 수 없다.
URL 인코딩이 생기는 이유
URL은 원래 영문 알파벳, 숫자, 일부 특수문자만 허용하는 규격이다. 한글, 공백, 특수문자가 포함되면 브라우저가 자동으로 퍼센트 인코딩(% + 16진수)으로 바꿔서 전송한다.
- 한글 "안녕" →
%EC%95%88%EB%85%95(UTF-8 기준) - 공백 →
%20 - & 기호 →
%26 - = 기호 →
%3D
이건 오류가 아니라 정상적인 동작이다. 다만 사람이 읽기 불편하기 때문에 원문을 확인하려면 디코딩이 필요하다.
encodeURI와 encodeURIComponent 차이
| 방식 | 인코딩 대상 | 유지 문자 | 용도 |
|---|---|---|---|
| encodeURI | 한글, 공백 등 | : / ? & = # | 전체 URL 인코딩 |
| encodeURIComponent | 모든 특수문자 포함 | 영문, 숫자, - _ . ~ | 쿼리 파라미터 값 인코딩 |
전체 URL을 인코딩할 때는 encodeURI를 쓰고, 검색어나 파라미터 값만 따로 인코딩할 때는 encodeURIComponent를 쓴다. 잘못 쓰면 https://의 슬래시까지 인코딩돼서 URL이 깨진다.
TIP API 요청에서 쿼리 파라미터에 한글을 넣을 때 인코딩을 빠뜨리면 400 에러가 난다. 서버로 보내기 전에 파라미터 값만 encodeURIComponent로 감싸는 습관을 들이자.
인코딩/디코딩 하는 법
URL 인코딩 변환 도구에서 상단 탭으로 인코딩과 디코딩을 전환할 수 있다. 텍스트를 입력하면 실시간으로 변환 결과가 나오고, 입출력 문자 수와 변화율도 함께 표시된다.
"모든 문자 인코딩" 옵션을 체크하면 encodeURIComponent 방식으로 전환된다. 교환 버튼을 누르면 결과를 다시 입력으로 넣어서 역변환을 바로 확인할 수 있다.
한글 URL이 깨져 보이는 건 정상이지만, 읽어야 할 때는 디코딩 한 번이면 원문이 복원된다.