뇌를 자극하는 윈도우즈 시스템 프로그래밍 - 2

김민교·2023년 7월 3일
0

아스키코드 : 1바이트로 표현, 문자는 알파벳만.
유니코드 : 2바이트로 표현, 온갖언어 가능

SBCS ( Single Byte Character Set)
: 문자를 표현하는데 1바이트만 사용

MBCS ( Multi Byte Character Set)
: 문자 표현하는 데에 여러 바이트 사용. ex) 한글은 2byte, 영어는 1byte

WBCS ( Wide Byte Character Set)
: 문자를 2byte로 표현. 유니코드가 이에 해당.

#include <iostream>
using namespace std;

int main(void)
{
	char str[] = "ABC한글";
	int size = sizeof(str);
	int len = strlen(str);
	
	printf("배열 크기 : %d \n", size); // 1byte * 3 + 2byte *2 + 1byte(Null)  = 8byte
	printf("문자열 크기 : %d \n", len); // Null 문자포함x. 영어 3개 한클 4개로 인식중.

}

[실행결과]
배열 크기 : 8
문자열 크기 : 7

#include <iostream>
using namespace std;

int main(void)
{
	char str[] = "한글입니다."; // => 2byte*5 = 10byte.
	int i;

	for (i = 0; i < 5; i++)
		fputc(str[i], stdout); 
	// fputc 는 1byte씩 출력. 한글 하나에 2byte임.
	// 5번 출력하면 "한글" 까지...

	fputs("\n", stdout);

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

	fputs("\n", stdout);
	return 0;
}

이런 것 때문에 MBCS가 별로다. => WBCS 방식이 나왔다.

char -> wchar_t
기존의 char는 1byte 메모리 공간만 할당됨.
wchar_t형은 2byte 메모리 공간이 할당.

typedef unsigned short wchar_t;

"ABC" -> L"ABC"
L은 WBCS(유니코드)기반으로 표현하라는 의미다.
ABC\0 -> NULL 문자까지 8byte로 표현됨.

strlen -> wcslen

window 2000이상의 운영체제는 기본저긍로 유니코드를 지원한다. 지원 뿐만 아니라 내부적으로 모든 문자를 유니코드 기반으로 처리한다.

printf("Hello World");

운영체제가 알아서 "Hello World"를 2byte 유니코드 형식으로 변환한다. 이러면 성능에 영향을 끼칠 수 있다.

wprintf(L"Hello world!");

이렇게 하면 성능 영향 안끼친다~

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
	int i;
	
	for (i = 0; i < argc; i++)
		fputws(argv[i], stdout); 
    // char* 은 SBCS기반으로 문자열을  받겠다는 의미이다.
    // fputws는 wbcs 함수와 충돌. 여기서 오류가 발생한다.

	return 0;
}

char* -> wchart_t* 로 변경

#include <iostream>
using namespace std;

int main(int argc, wchar_t* argv[])
{
	int i;
	
	for (i = 0; i < argc; i++)
		fputws(argv[i], stdout);
    // 이렇게 바꾸면 에러는 안나지만 엉뚱한 결과가 나온다.
    // main이라는 함수는 전달되는 문자열을 MBCS 기반으로 구성하기 때문.
	
	return 0;
}
#include <iostream>
using namespace std;

int wmain(int argc, wchar_t* argv[])
{
	int i;
	
	for (i = 0; i < argc; i++)
	{
		fputws(argv[i], stdout);
		fputws(L"\n", stdout);
	}
	return 0;
}

wmain함수는 프로그램 실행 시 전달되는 문자열을 유니코드 기반으로 구성한다.

profile
안녕

0개의 댓글