cyphen156

문자 집합(MBCS VS UniCode) 본문

프로그래밍/Win32 API

문자 집합(MBCS VS UniCode)

cyphen156 2024. 8. 22. 19:47

윈도우즈 운영체제는 문자 집합을 사용할 때 두가지의 방식을 사용한다.

하나는 Multi Byte Character Set이며 다른 하나는 UniCode Character Set이다. 

이전까지는 문자 변수를 사용할 때 영어로만 사용했기 때문에 이 두 문자 집합에 대해 생각하지 않고 그냥 사용했지만 앞으로 만들 프로그램에서는 한글 입력, 출력 등을 필요로 하기 때문에 두 문자 집합에 대한 차이를 분명하게 인식하고 사용해야 한다.

Multi Byte Character Set

영어는 1바이트 아스키 코드를, 다른 국가 언어(한국어, 중국어 등)의 언어는 2바이트 이상의 메모를 사용하여 완성형 코드를 사용하는 방법. 

필요한 경우에만 2바이트 문자열을 사용하기 때문에 메모리 효율성이 좋지만 문자를 처리할 때 복잡성이 늘어나기 때문에 효율적인 알고리즘이 필요해 진다는 단점이 있다. 

UniCode

전 세계 문자를 표현하기 위해 제정된 국제 문자 표준, UTF-8, UTF-16, UTF-32와 같은 인코딩이 있다.

뒤에 있는 숫자는 문자를 표현하기 위해 사용되는 메모리의 크기를 의미하기 때문에 어떤 나라의 언어를 사용하던지 한번 인코딩 된 코드라면 모두 같은 크기를 갖는다는 장점이 있다. 

그러나 이렇게 개념만 설명해놓으면 뭐가 문제인지 인식하기 어렵다. 

예시 코드를 통해 확인해보자. 다음과 같이 예제 코드를 작성하였다.

프로젝트 속성창에서 사용된 문자집합을 확인해 보면 다음과 같이 유니코드 문자 집합을 사용한다고 나온다.

#include <stdio.h>

int main(int argc, char* argv[])
{
	//주석주석주석주석
	//abcdefgh
	return 0;
}

위의 코드를 비주얼 코드 창에서 프로젝트를 연결하고 해당 코드를 열어보면 다음과 같이 주석문이 깨진다.

이걸 해결하려면 비주얼 코드의 오른쪽 하단에 있는 문자 집합 규칙에서 인코딩을 변경해야 한다.

보통 저런식으로 문자열이 깨진다면 EUC-KR로 열어주어야 한다.

그런데 유니코드로 작성된 코드를 왜 비주얼 코드에서는 제대로 인식하지 못할까?

그건 비주얼 스튜디오에서의 유니코드 문자 집합 규칙이 [각주:1]EUC-KR 또는 [각주:2]CP 949로 설정되어 있기 때문이다. 

파일을 다른이름으로 저장할 때 인코딩 하여 저장 옵션을 선택하면 다음과 같이 CP949로 기본설정되어있는것을 확인할 수 있다.

그래서 다음과 같이 UTF-8로 저장하면 VS코드로 열었을 때 인코딩 문제가 발생하지 않는것을 알 수 있다.

현재는 비주얼 스튜디오 기본 규칙이 유니코드를 통해 컴파일 하는것이 기본적으로 설정되어있기 때문에 잘 신경쓰지 않지만 사용되는 문자 집합에 따라 같이 사용되는 함수, 문자 자료형도 변경되니 잘 알아두어야 할 것 같다. 

참고로 멀티 바이트 문자집합을 사용할때 윈도우 기본 메인 함수는 WinMain(), 유니코드를 사용할 때는 wWinMain()이다.

  1. 완성형 한글 인코딩 방식, 가/갇 과 같이 하나의 완성된 단어에 하나의 고유번호를 부여한다 [본문으로]
  2. EUC-kr을 확장한방식 [본문으로]

'프로그래밍 > Win32 API' 카테고리의 다른 글

Win32 API #1  (1) 2024.07.20