2007.09.27 소스 코드와 테스트 결과 모두 오류가 있어서 글을 고쳐 썼습니다. 죄송합니다.


거의 모든 문자열을 TCHAR로 선언해서 쓴다. _UNICODE가 선언되어 있으니 사실상 wchar_t 타입인 셈이다. 한데 TCHAR*이나 std::wstring에 담긴 한글 문자열을 STDOUT에 출력하려니, 잘 안 됐다. 여태까진 로그를 모조리 영어로 써놔서 몰랐는데, 한글 문자열은 아예 출력이 안 되거나 ???로 표시됐다.

구글링을 해보니 로케일 설정을 해야 한다고 했다. 로케일 설정을 크게 두 가지로 나뉜다.

setlocale(LC_ALL, "korean");
_tprintf("한글\n");

이렇게 하면 된다기에 해봤지만 신통치 않았다. MSDN 라이브러리를 뒤져보니 _wsetlocale가 있었고, 코드를 이렇게 고쳤더니 한글이 출력됐다.

_wsetlocale(LC_ALL, _T("korean"));
_tprintf("한글\n");

아싸, 해결됐다!라고 잠시 착각했지만, 곧바로 새로운 문제가 등장했다.

_wsetlocale(LC_ALL, _T("korean"));
std::wcout << _T("한글") << std::endl;

을 하니 또 한글이 안 나온다. 하여 다시금 구글링을 했다.

std::locale::global(std::locale("kor"));
std::wcout << _T("한글") << std::endl;

를 하면 된다고 하길래 해봤지만, 여전히 결과가 신통치 않았다. 이번에는

wcin.imbue( locale( "korean" ) );
wcout.imbue( locale( "korean" ) ); 
std::wcout << _T("한글") << std::endl;

를 해보라기에 시도했더니 한글이 출력됐다. 아싸! 또 좋아라 했지만, 이번에도 문제가 있었다.

wcin.imbue( locale("korean") );
wcout.imbue( locale("korean") );
wcout << _T("한글1") << endl;

_wsetlocale(LC_ALL, _T("korean"));
_tprintf(_T("한글2\r\n"));

wcin.imbue( locale("korean") );
wcout.imbue( locale("korean") );
wcout << _T("한글3") << endl;

_tprintf(_T("한글4\r\n"));

을 했는데 한글3만 출력이 안 되는 게 아닌가? _wsetlocale을 한번이라도 호출하면 그 시점부터 wcout이 제대로 작동하질 않았다. 이거야말로 재앙이 아닌가?

결국 정확한 원인을 찾기 귀찮은 나머지 _tprintf와 _wsetlocale은 한동안 쓰지 않기로 했다. 누구 해결책 아시는 분 안 계신가요?