본문 바로가기

Developement/C/C++

STL C/C++ 에서 자동 Locale 설정 하기.

MinGW-W64 가 버젼이 올라 감에 따라 다국어 처리도 강화 되고 있습니다만, 표준 C/C++ 에서 자동으로 한국어 또는 구동되는 OS 에 맞게 std/stl 의 locale 설정을 하고 싶어서 아래 코드 처럼 만들었습니다.

 물론 이는 Windows 에서만 해당 하는 부분이며, 사용을 위해서는 <windows.h> 와 <winnls.h> 를 #incldue 로 넣어 주어야 합니다.


void procLocale()
{
#ifdef DEBUG
    printf("### AUTO LOCALE SET @ WINDOWS ###\n");
#endif ⁄⁄⁄ of DEBUG

    LCID    currentLCID = GetSystemDefaultLangID();
    wchar_t currentLoc[LOCALE_NAME_MAX_LENGTH] = {0};
    char    convLoc[LOCALE_NAME_MAX_LENGTH] = {0};

#ifdef DEBUG
    printf("LCID = %08X( %d )\n", currentLCID, currentLCID );
#endif ⁄⁄⁄ of DEBUG

    LCIDToLocaleName( currentLCID, currentLoc, LOCALE_NAME_MAX_LENGTH, 0 );

    mbstate_t mbs;
    mbrlen( NULL, 0, &mbs );

    const wchar_t** pw = (const wchar_t**)currentLoc;

    wcsrtombs( convLoc, pw, LOCALE_NAME_MAX_LENGTH, &mbs );

    const char* retloc = setlocale( LC_ALL, convLoc );

#ifdef DEBUG
    printf("Locale name = %s -> %s \n", convLoc, retloc );
#endif ⁄⁄⁄ of DEBUG
}


 이 함수를 main() 과 같은 초기 구동부에서 한번 불러 주게 되면, 왠만해서는 ANSI 또는 UTF-8 을 쓰는 환경에서도 해당 OS 에 맞는 언어체계로 파일을 읽거나 쓰는데 지장이 없을 것 입니다. 다만 이는 TCHAR 를 쓰지 않는 FLTK 와 같은 라이브러리 (UTF-8을 사용함) 와 함께 사용할 때 적합한 것임을 먼저 인지하고 사용하는 것이 좋습니다.

 아래는 MinGW-W64 5.x 이후라면 DEBUG 에서 출력되는 값 입니다.