C++ Wide Characters
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; }