본문 바로가기

Programming/C&CPP

한글 윈도우즈, Visual C++ 한글 처리 방식

반응형

이 세상에는 상당히 많은 수의 문자가 존재합니다.

얼핏 떠오르는 문자로 영어의 알파벳, 일본어의 히라가나와 가타카나, 우리의 한글, 중국 한자 등등

상당히 많은 수의 문자가 있습니다.

C/C++에서는 기본적으로 char 형을 사용해서 문자를 표현합니다.

하지만 char 형은 1바이트 크기 밖에 되지 않습니다.

그래서 아무리 많이 쓰려고 발버둥을 쳐봐도 256가지(2의 8 승)의 문자밖에 표현하지 못합니다.

그래서 영어와 몇몇의 기호, 숫자 만을 표현하게 했는데, 이것이 바로 ASCII 코드입니다.

하지만 다양한 언어를 포괄하기 위해서는 좀 더 큰 크기가 필요하게 됩니다.

크기를 잘못 잡아서 문제가 생기는 경우를 종종 발견할 수 있습니다.

IPv4와 IPv6가 대표적으로 크기를 잘못 잡아서 발생한 문제입니다.

이렇게 해서 나온 것들이  MBCS(MultiByte Charset), Unicode 등등입니다.

C++과 한글 윈도우즈에서 MBCS로 설정되었을 때 한글은 어떻게 표현되는지 알아보도록 하겠습니다.

MBCS는 이름에서 보이듯이 멀티 바이트를 사용하는데

영어는 1바이트, 한글은 2바이트로 적용하는 가변적인 바이트를 사용하게 됩니다.

우리가 일반적으로 사용하던 방식입니다.

문제점은 조합형으로 초성 + 중성 + 종성의 형식으로 5,5,6 bit 정도로 표기하면 참 쉬웠겠으나

그렇게 하지 않고 모든 문자를 하나하나 1:1로 대응을 시켜놓았습니다.

그것도 질서 정연하지 못하게 말이죠.

초성 + 중성 + 종성의 조합으로 만드는 방법이 물론 존재하는데 이것을 조합형이라고 부릅니다.

하지만 우리가 지금 볼 것은 완성형 코드 체계입니다.

C++에서 보통 이렇게 처리되기 때문입니다.

완성형 코드 체계는 가 = 0xB0A1, 각 = B0A2 이런 식으로 구성이 되어 있습니다.

이런 방식을 채택한 것은 KS X 1001이라는 정보 교환용 부호계 (한글 및 한자) 라는 표준입니다.

하지만 이 방식에도 문제점은 있었으니 몇몇 이상한 문자들을 표기하지 못하는데 있습니다.

예를 들자면 '뷁', '똠'(구 시스템에서는 보이지 않을 수 있습니다. 또 + ㅁ) 이런 것들 입니다.

(이외에도 엄청 많은 글자가 빠져있습니다.)

그래서 KS X 1002, 1003 등등 계속 새로운 것을 만들어 내게 됩니다.

하지만 그것만으로는 부족했기 때문에 윈도우에서는 이 다양한 문자들을 모두 수용하기 위해서

CP(codepage)라는 것을 도입하게 되었습니다.

CP는 지구상에 존재하는 엄청난 문자를 2바이트만으로 표현할 수 있게 만들어 줍니다.

CP를 바꾸게 되면 같은 값이더라도 지역에 맞는 문자를 출력해 주는 것이 바로 그 방식입니다.

자세한 예는 밑에 보여 드리도록 하겠습니다.

KS X 1001 한글 부분표

이것이 KS X 1001을 표기하는 방식을 적어놓은 표인데 대충 봐도 참 보기 어렵습니다.

보면 알겠지만 없는 한글이 꽤나 보일 것입니다.

CP 949는 기존 KS X 1001 한글 표현에 새로운 한글을 추가했다고 보면 됩니다.

순서를 지키지 않고 끼워넣어진 것이기 때문에 상당히 정리가 안되어 있습니다.

이 부분은 기존의 방식과 호환을 유지하기 위해서는 어쩔 수 없는 선택이었을 것입니다.

명령어 중에 chcp 949, chcp 437 와 같은 명령어가 존재합니다.

이것이 바로 CP를 변경해주는 명령어입니다.

chcp 437을 하면 한글은 작성이 안될 것입니다.(cmd에서 확인 가능)

949는 한글 표기를 위한 cp의 번호이고, 437은 US 표기를 위한 cp 번호인 것입니다.

그리고 저 chcp라는 것은 change cp정도 되는 명령어인 것이죠.

일단 KS X 1001에서 보면 '가'는 0xB0A0으로 표현되는데 CP에서도 동일하게 적용됩니다.

즉, 기본적으로는 KS X 1001의 코드를 그대로 사용한다는 것이죠.

그리고 새로운 한글을 같은 방식으로 차곡차곡 정의해놓았는데 MSDN에 검색해보면 나옵니다.

예로 다음의 표를 보여드리도록 하겠습니다.

Windows 949_81이라는 표인데 이것은 0x81에 있는 문자들을 의미합니다.

KS X 1001에는 없던 문자들이 추가로 정의가 되어 있습니다.

코드를 보면 '갂'은 0x81 표에서 41이라고 되어 있습니다.

좌측의 40에 상단의 1을 더하고 0x81과 합쳐주면 값을  알 수 있습니다.

그럼 '갂'의 코드표는 0x8141이 되는 거죠.

위에 cp에 따라서 표현되는 문자가 달라진다고 했던 것을 기억하고 다음의 테이블을 보겠습니다.

일본 표기를 따르는 곳에서는 어떻게 사용되는지 보도록 하겠습니다.

일본어를 위해서는 932라는 코드를 할당해 두었습니다.

그럼 Windows 932-81 표를 보도록 하죠.

같은 값을 갖는 테이블이지만 표시되는 문자는 완전히 다릅니다.

요약하면 다음과 같습니다.

Windows에서는 다양한 문자를 표기하기 위해서 CP라는 것을 적용했다.

이 CP는 같은 바이트 값이더라도 다른 문자를 출력해주는 것이 가능하기 때문에

모든 문자를 수용할 수 있다.

C++의 MBCS의 방식도 CPTable을 기반으로 하며 한글은 CP 949에 정의 되어있다.


마지막으로 되도록이면(무조건) 유니코드(Unicode)를 사용해서 개발하는 습관들입시다.


반응형