아스키코드 : 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함수는 프로그램 실행 시 전달되는 문자열을 유니코드 기반으로 구성한다.