C++/wchar_t

C++ Wide Characters

Soul-Learner 2016. 12. 21. 18:49

C++ 프로그래밍, wchar_t 자료형 다루기

C++에서 wchar_t 는 아스키 코드로 표현할 수 없는 국제문자를 다루기 위한 자료형이다. 국제문자는 유니코드 표준이 있는데 유니코드로 입력될 수 있는 문자는 wchar_t 형의 변수에 저장될 수 있다. 와이드 문자열을 지원하기 위한 클래스로는 wstring 이 있다

wchar_t 배열은 C 언어의 문자배열과 마찬가지로 마지막에 널문자('\0')를 추가해야 프로그램이 오작동하지 않는다.

wchar_t 형의 변수나 배열에 와이드 문자 리터럴을 할당할 때는 접두어 'L' 을 사용해야 하고 와이드 문자를 출력할 때는 wcout, wprintf 등의 함수를 사용해야 한다. 그리고 와이드 문자열의 길이를 확인할 때는 wcslen() 함수를 사용해야 한다 (<cstring> 헤더파일이 필요함)


Eclipse, MinGW 에서 소스파일을 UTF-8로 설정하기

아래의 예제는 Eclipse, MinGW 를 사용했으며, Windows 8에서 테스트한 내용이다. 소스코드나 화면 출력시에 한글이 깨지지 않게 하려면 소스파일의 인코딩을 UTF-8 으로 설정해야만 제대로 작동했다. 

Eclipse의 프로젝트 익스플로러의 src 아래 있는 소스파일명 위에서 마우스 우측을 누르고 Properties 를 선택하고 아래의 설정 창과 같이 해주면 된다

Eclipse에서 소스파일(*.cpp)의 문자 인코딩을 UTF-8로 설정하기


와이드 문자(wchar_t), 와이드 문자열(wstring) 테스트 예제

#include <iostream>
#include <locale>
#include <cstring>  // wcslen() 사용을 위해

using namespace std;

int main()
{
    setlocale(LC_ALL, "");  // 현재 설치된 운영체제의 기본 언어, 한번만 선언하면 된다

    cout << "C++ Wide Character Test" << endl;

    wchar_t wc = L'가';  // 와이드 문자 리터럴 앞에 'L' 접두어를 사용한다

    // 출력할 때는 wcout, wprintf 등의 함수를 사용한다
    wcout << "wc=" << wc << endl;  // 가
    wcout << L"wc 변수의 메모리 사이즈:" << sizeof(wc) << endl;   // 2

    // 와이드 문자 배열
    wchar_t wch[] = L"프로그래밍";
    wcout << "wch[]=" << wch << endl;  // 프로그래밍
    wcout << L"wch 배열의 메모리 크기:" << sizeof(wch) << endl;   //12
    wcout << L"wch 배열의 문자 수:" << wcslen(wch) << endl;      // 5
    wcout << L"wch 배열의 방의 갯수:" << sizeof(wch)/sizeof(wch[0]) << endl; // 6
    wcout << "wch[0]=" << wch[0] << endl;  // 프

    // 배열을 명시적으로 생성하는 경우, null 문자('\0')를 반드시 포함해야 오작동하지 않음
    wchar_t wcArr[] = {L'프',L'로',L'그',L'래',L'밍','\0'};
    wcout << "wcArr[]=" << wcArr << endl;
    wcout << L"wcArr[]의 메모리 크기:" << sizeof(wcArr) << endl;

    // 와이드 문자열을 지원하는 클래스, std::wstring
    wstring ws(L"프로그래밍");
    wcout << L"ws=" << ws << endl;

    // 와이드 문자열을 와이드 문자 포인터로 변환하기
    const wchar_t *str = ws.c_str();
    wcout << "str=" << str << endl;

    return 0;
}


WCS(Wide Character Sets, Unicode) / MBCS(Multibyte Character Sets) 변환 예

#include <iostream>
#include <locale>
#include <cstdlib> // wcstombs()

using namespace std;

int main() {
	setlocale(LC_ALL, "");
	wcout << L"C++ 문자집합 변환의 예" << endl;

	// WCS(Wide Character Sets) / MBCS(Multibyte Character Sets)
	wstring wstr = L"한글 이 문장은 몇바이트인가";	// WCS (Unicode)
	int wcSize = sizeof(wchar_t);
	int wstrSize = wstr.size()*wcSize;
	wprintf(L"wchar_t 크기:%d, 문자열길이:%d, 총 바이트수:%d \n"
						,wcSize, wstr.size(), wstrSize);

	// WCS -> MBCS 변환(wchar_t* -> char*)
	char* mbs = new char[wstr.size()*2];	// 한글 1자는 2바이트
	const wchar_t* wcs = wstr.c_str();

	// #include <cstdlib>
	wcstombs(mbs, wcs, wstr.size()*2);

	// WCS, MBCS 화면출력의 예
	cout << mbs << endl;		// char*

	wcout << wcs << endl;		// wchar_t*
	wcout << wstr << endl;		// wstring

	wprintf(L"%S \n", wcs);		// %S 대문자 사용
	wprintf(L"%S \n", wstr.c_str());

	return 0;
}