3월 19, 2024

Unicode, UTF-8, UTF-16, EUC-KR 인코딩에 대해 알아보자

Unicode, UTF-8, UTF-16, 인코딩 등의 용어...

한번쯤은 다 들어봤을 것이다.

하지만 그럼에도 불구하고 정확한 정의와 개념 간의 차이점에 대해 완벽하게 알지 못하는 사람들이 많을 것이다. 


1. Unicode

먼저 가장 큰 범주의 개념이라고 할 수 있는 Unicode부터 살펴보자.

우리는 언어를 'A', 'a', '가', '나', '다' 등 문자로 인식하지만 컴퓨터는 오로지 0과 1로만 이루어진 숫자로 인식한다. 따라서 컴퓨터가 사람의 언어를 이해하기 위해서 언어를 bit 형식의 숫자로 변환, 중개하는 역할을 유니코드가 한다고 생각하면 된다. 

 

예를 들어, 한글의 '가'는 0xac00으로 맵핑이 되고 'A'는 0x0041로 맵핑이 된다. 이런식으로 나라 별 언어가 어떻게 인덱스로 변환되는지를 살펴보고 싶다면 아래 code charts를 참고해보면 된다. 

전세계 나라들에서 사용하고 있는 언어의 문자가 어떻게 mapping되는지를 보여주고 있다. 

http://www.unicode.org/charts/


UTF는 Unicode를 인코딩 (encoding) 해주는 방식이라고 생각하면 된다. encoding이 필요한 이유는 human language와 컴퓨터 언어 사이의 변환이 필요하기 때문이다. Unicode에서 사람 언어와 컴퓨터 bit 사이의 mapping하는 표를 만들어 주고 그 표를 보면서 서로간의 변환을 도와주는 역할이 UTF라고 보면 된다. 

 

UTF에도 여러 종류가 있다. 대표적으로 많이 들어본 것이 UTF-8과 UTF-16일 것이다. 

UTF-8과 UTF-16의 차이는 문자 하나를 표현할 때 사용할 최소 bit의 차이에 있다. 즉 UTF-8은 문자 하나를 표현할 때 최소 8bit가 필요한 반면, UTF-16은 문자 하나를 표현할 때 최소 16bit가 필요한 것이다. 

 

2. UTF-8

이 중 더 많이 쓰이는 UTF-8 인코딩 방식에 대해 자세히 알아보자. UTF-8 방식은 가변형 인코딩 방식이라고 불린다. 이유는 한글의 경우 초성, 중성, 종성이 있기 때문에 주로 3바이트로 가변 표기 되기 때문이다. UTF-8 방식은 아스키 코드와 호환이 가능하며, 현재 대부분의 환경에서 문자열 처리의 표준으로 자리매김하고 있다. 

 

3. UTF-16

반면 UTF-16의 경우 16 bit 기반으로 문자를 인코딩하기 때문에 한글 또한 2byte로 저장될 수 있다. 영어와 한글이 모두 2byte로 처리되기 때문에 UTF-16은 가변표기 인코딩이 아니다라는 오해가 있는데, 이는 틀린 말이다. UTF-16 인코딩 방식 또한 UTF-8 인코딩과 마찬가지로 가변 표기 인코딩 방식이며, BMP 이외의 문자들은 2byte가 아닌 4byte로 인코딩 되기도 한다. 위 UTF-8 인코딩을 설명할 때 UTF-8 방식이 대부분의 환경에서 문자열 처리의 표준이라고 했는데 자바 기반에서는 UTF-16을 사용한다고 보면 된다. 또한 UTF-16의 경우 UTF-8과 달리 아스키 코드와 호환되지 않는다는 특성을 가지고 있다. 

 

4. EUC-KR

EUC-KR은 한국에서 독자적으로 사용하고 있는 인코딩 방식으로, 완성형 인코딩 방식이라고 불린다. 즉, 초성, 중성, 종성을 조합하여 인코딩을 하는 것이 아니라 완성된 상태의 문자를 2Byte로 표현하는 방식이라고 생각하면 된다. 미리 정해놓은 표를 사용하여 인코딩을 하는 것이고 각 문자마다 2byte의 값이 정해져 있는 형태이다. 

 

 


이런 다양한 인코딩 방식으로 자바에서도 컴파일 시 인코딩 문제가 일어나기도 한다.

해당 문제를 해결하는 법은 아래 포스트를 참고하면 되겠다.

https://www.programmingstory.com/2024/02/unmappable-character-for-encoding-ms949.html