인코딩, URL 인코딩이란?

브라우저인지 서버인지 프레임워크인지.. 그 누군가 해주었기 때문에 매번 넘어갔던 ‘인코딩’.
잊을만할 때 쯤이면 “한글이 (갑자기) 깨져요..”라며 발목을 잡는다.
브라우저의 인코딩, 서버 인코딩, jvm option 등등으로 잡히는대로 바꿔가며 해결하고자 했던 인코딩
그래서 이번 기회에 인코딩의 개념을 정리해보기로 하였다.

인코딩

종국에는 모든 문자는 0/1로 표현된다.
내 맘대로 0/1로 매핑할 수 없으니 0과1의 조합으로 문자를 표현한 ‘규약’이 필요하다.
인코딩은 이 규약에 따라서 문자를 표현한 것인데,
인코딩 개념을 위해 ‘코드’와 ‘인코딩’을 구별할 줄 알아야 한다.

문자코드 vs 문자인코딩

문자코드

복호화 상태 본래의 문자나 기호를 뜻하는 ‘부호’.

문자인코딩

문자나 기호들의 집합을 표현하는 방법.

이렇게만 설명하면, 코드와 인코딩의 차이점이 알 것 같으면서도 내가 제대로 이해했나 싶다.
그래서 예시로 이해해보겠다.

ASCII(American Standard Code for Information Interchange)

최초의 문자 코드. 라틴 문자, 숫자, 몇몇 특수문자 128(2^7)개를 1:1 대응함. 2^7->7비트.
컴퓨터가 보통 1바이트(=8비트)씩 사용하기 때문에 업체마다 ASCII에 1비트를 추가한 8비트 아스키 인코딩이 생겼다.
그런데, 컴퓨터를 만든 업체/회사마다 서로 이 1비트를 가지각색으로 추가하다보니(누구는 1비트를 앞에다.. 누구는 뒤에다…), 인코딩계의 춘추전국시대가 일어났다.

이 문제를 해결하기 위해 전 세계 모든 문자를 일관되기 표현하기 위해 유니코드 등장하였다.

유니코드

기존 아스키코드(영문)을 포함해 전세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다.
산업표준이기에, 요즘 대부분의 경우 인코딩 방식은 UTF-8을 쓰면 된다 라고 생각하면 된다.

익히 들어본 UTF-8(Universal coded character set + Transformation Format - 8 bit)은 유니코드를 인코딩한 방식 중의 하나이다.
한 문자를 나타내기 위해 1byte~4byte까지 가변적으로 사용한다. 당연히 ASCII 에 있는 문자는 1byte만 사용된다.
또 많이 들어본 EUC-KR은 EUC(Extended Unix Code) 기반 8비트 문자 인코딩 방식 중 하나이다. EUC는 한국어, 중국어, 일본어 문자 전산화에 사용되는 8비트 문자 인코딩 방식이다.

여기까지 읽었다면, ASCII, UTF-8, EUC-KR 등 뭐가이렇게 많나 싶었던 인코딩들이 정리되었을 것이다.(기승전 UTF-8)
마지막으로, 이왕 알아본 김에 웹프로그래밍에 많이 나오는 URL 인코딩도 알아보자.

URL Encoding

URL(Uniform Resource Locator)

는 인터넷 상 리소스의 주소이다.
scheme:[//[user:password@]host[:port]]/path[?query][#fragment]
로 표현함.

이러한 URL은 US-ASCII 문자코드로 한정된 글자(약 127개, 0-9/A-Z/a-z/일부 특수문자)만 표현이 가능하다.
즉, non ASCII 문자는 URL에 표현 불가능하다.
URL Encoding은 ASCII 범위에 없는 문자를 %라는 특수기호 다음 16진법으로 2글자로 인코딩하는 방식이다.
특정 character encoding으로 몇 byte 표현 후 이를 % + 16진법 두자리로 표현함.
브라우저별로 URL 표기줄에 encode된 상태(%)로 보여주는 곳도 있고 decode된 상태로 보여주는 곳도 있기에 우리는 잘 인지하지 못했었다.
~~(브라우저 만만세)