[Visual C++] 문자열에 대하여 – 유니코드, 멀티바이트

가끔 프로그램을 만들다 보면 코드상으론 한글을 잘 표시했는데, 실행시켜보면 한글이 깨져있는 경험들이 있을겁니다.

프로그램뿐만 아니라 파일에서도 분명히 한글로 저장했는데 메모장으로 열었을 때 한글이 저장되어있지 않은 경우도 있구요. 최근엔 프로젝트 생성하더라도 유니코드로 기본 설정 되는데 가끔 개발을 하다보면 멀티바이트, 와이드캐릭터 등 이야기를 할 때가 있습니다.

초기에 컴퓨터가 만들어졌을 때엔 컴퓨터는 단어 그대로 compute, 수치 연산을 하기 위한 장치였습니다. 그러나 컴퓨터가 발전하고 문자를 표현해야하는 경우가 생겨나기 시작합니다. 컴퓨터와 컴퓨터간 문자 데이터를 교환하기 위해 표준이 필요했는데, ASCII(American Standard Code for Information Interchange)가 생겨나게 됩니다.

ASCII는 0x00 부터 0x7F까지 총 127개의 문자로 이루어져 있습니다. 이름만 봐도 미국에서 만들어진 표준이기에 알파벳을 표현하는데엔 문제가 없었지만 유럽어는 사용할 수 없었습니다. 그래서 새로운 문자가 추가되어 ASCII 유럽어를 표현 할 수 있게 됩니다.

하지만..

ASCII의 256개의 코드로는 전 세계의 언어를 처리할 수 없습니다. 특히나 한국, 중국 일본에서 사용하는 문자는 그 개수가 너무 많아 확장된 ASCII로도 모두 처리할 수 없죠. 그래서 아래와 같은 방식들이 나오게 됩니다.(한글을 처리하기 위한 방안만 소개해드립니다.)

EUC-KR

EUC-KR은 한글 지원을 위해 유닉스 계열에서 나온 완성형 8비트 문자 인코딩입니다. KS X 1001, KS X 1003 표준안의 인코딩 방식이고, 2,350자의 한글만 표시합니다.

CP949

MS949, x-windows-949, 확장 완성형의 인코딩 방식입니다, 11,172자의 한글 표현합니다.

이러한 방식은 모든 문자를 문자를 표시하기 힘들어 전 세계의 모든 문자를 표시하기 위한 코드 조합, UNICODE가 생겨나게 됩니다.

UNICODE

유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현 할 수 있게 만들어진 코드 조합니다.
유니코드는 ‘인코딩’이 아닙니다. 2byte로 전 세계의 문자를 1:1 매핑 시키는 방식을 말합니다.
예시로 아래 링크는 유니코드 0xC000 ~ 0xCFFF까지 한글 매핑입니다.

유니코드표는 여기를 보시면 됩니다.

유니코드를 표현하기 위해 여러가지 ‘인코딩’ 방식이 있습니다. 대표적으로 UTF-7, UTF-8, UTF-16, UTF-32 인코딩이 있습니다.
아래 표는 코드 범위에 따른 UTF-8 인코딩 방식입니다.

코드 범위비트수인코딩
U+0000 ~ U+007F7그대로 사용
U+0080 ~ U+07FF11110XXXXX 10XXXXXX
U+0800 ~ U+FFFF161110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFFF2111110XXX 10XXXXXX 10XXXXXX 10XXXXXX

만약 한글 ‘사’의 경우, 유니코드 값과 UTF-8 인코딩으로는 변환한 값은 아래와 같이 표시됩니다.

UNICODEUTF-8인코딩
C0AC(1100 0000 1010 1100)EC82AC(1110 1100 1000 0010 1010 1100)