유틸리티

URL 인코딩 디코딩, 한글 주소 깨짐 해결하는 법

블로그 글 링크를 복사해서 메신저에 붙여넣었더니 한글 부분이 %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이 깨져 보이는 건 정상이지만, 읽어야 할 때는 디코딩 한 번이면 원문이 복원된다.