컴퓨터 구조 + 운영체제

MBCS 기반의 문자열

뽀또치즈맛 2025. 6. 14. 14:43

1. 문자열 배열 크기와 길이 계산하기

MBCS와 WBCS에 대한 기본적인 이해를 돕기 위해서 예제를 하나 실행해 보자.

이 예제의 실행결과를 통해서 현재 사용하고 있는 운영체제의 문자열 처리 방식을 확인해 볼 수 있다.

 

/*
*	MBCS1.cpp
*/

#include <stdio.h>
#include <string.h>

int main(void)
{
	char str[] = "ABCDEF가나다라마바사";
	int size = sizeof(str);
	int len = strlen(str);

	printf("배열의 크기 : %d \n", size);
	printf("문자열의 길이 : %d \n", len);


	return 0;

}

 

"ABCDEF가나다라마바사"라는 문자열로 배열을 초기화하고 있다.

배열의 크기를 명시적으로 선언하지 않았으므로 문자열의 길이를 기반으로 크기가 결정되었다.

 

각각 배열의 크기와 문자열의 길이를 계산하고 있다.

 

2. 문자열 처리 방식에 따른 배열 크기 확인하기

실행 결과를 보면 우리에게 보여주는 바는 상당히 크다.

우선 배열의 크기를 살펴보자.

 

배열의 크기는 28바이트임을 알 수 있다.

과연 어떻게 해서 28바이트가 나오게 된 것일까?

 

ABCDEF(6바이트) + 가나다라마바사(21바이트) + NULL 문자 (1바이트) = 28 바이트이다.

 

필자가 사용하는 운영체제의 문자열 처리 방식은

한글에 대해서 3바이트씩 끊어서 사용하므로 이는 MBCS 기반 문자열이 아님을 알 수 있다.

 

만약 MBCS 기반 문자열에서

 

str을 "ABC한글"로 변경한다면

 

ABC(3바이트) + 한글(4바이트) + NULL(1바이트) = 8바이트의 배열의 크기가 될 것이다.

 

적절한 계싼을 통해서 영문은 1바이트, 한글은 2바이트로 처리되는 것이다.

 

이번에는 문자열 길이를 살펴보자.

변환된 str 문자열에서는

배열의 크기가 8이고, 문자열 길이가 7이라고 출력이 될 것이다.

 

이것은 어떻게 해서 나오게 된 결과일까?

함수 strlen은 문자열의 길이를 계산함에 있어서 NULL문자를 포함하지 않는다는 것을 알 수 있다.

 

또 하나 알 수 있는 사실은 무엇일까?

ABC (길이 3) + 한글 (길이 4) = 7

 

"ABC한글:의 실제 길이는 5이지만, "한글"이라는 단어는 길이가 4로 인식되고 있다.

이것이 바로 MBCS의 문제점이다.

 

MBCS에서의 문자열 출력 시 문제 발생 예시 코드

 

다음은 MBCS의 또 다른 문제점을 보여준다.

 

/*
*	MBCS2.cpp
*/

#include <stdio.h>
#include <string.h>
#include <windows.h>

int main(void)
{
	char str[] = "한글입니다.";
	int i;

	for (i = 0; i < 5; i++)
		fputc(str[i], stdout);

	fputs("\n", stdout);

	for (i = 0; i < 10; i++)
		fputc(str[i], stdout);

	fputs("\n", stdout);

	return 0;

}

 

이 예제에서 주의 깊게 볼 부분은 11번쨰 줄에 선언되어 있는 for루프와

16번째 줄에 선언되어 있는 for 루프의 반복 회수이다.

 

좀 깨지긴 하지만,

한글

한글입니다.

 

라고 출력되었다고 가정하자.

 

위 예제 8번째 줄에 선언되어 있는 문자열은 누가 보더라도 길이가 5이다.

그러나 실행 결과를 보면 for 루프 내에 선언되어 있는 fputc 함수를 10번 호출해야만 정상적인 출력이 이뤄짐을 알 수 있다.

문자열 길이는 5이지만,

문자열에 할당된 크기가 10바이트인 관계로 1바이트 데이터를 출력하는 fputc함수를 10번 호출해야만 한다.

 

이제 MBCS의 문제점을 확실히 이해했을 것이다.

물론 이러한 문제점들도 프로그래밍을 잘해나가면 어느 정도 해결이 가능하다.

그러나 그만큼 주의를 기울여야만 한다.

따라서 프로그래밍을 하기가 까다로워질 수밖에 없다.

 

이러한 문제점의 해결책이 될 수 있는 것이 바로 WBCS 방식이다.

WBCS 방식은 모든 문자열을 2바이트로 처리한다.

모든 문자들을 동일한 바이트의 크기로 처리한다는 것이 MBCS의 문제점을 해결하는 실마리가 된다.