본문 바로가기

C++

wchar_t 사용에 관하여 [2]

[1. 개요]

멀티바이트 문자열에서 wide char 문자열로 변환 혹은 그 반대 방향으로 변환 시 주의 점.

  • Locale 에 대한 이해
  • 인코딩 변경이므로, 데이터 인코딩이 적절한지 확인
  • 출력에 관하여.

[2. Locale 에 대한 이해]

리눅스 기준으로는

  • locale -a 를 이용하여, 현재 시스템에 설치된 locale 을 확인 할 수 있다.
  • # locale-gen ko_KR.UTF-8 을 이용해서 한국어 관련 locale 을 설치 할 수 있다.

윈도우에서 파워 쉘 기준으로는

  • Get-WinSystemLocale 명령어로 확인 가능

[3. 리눅스 관련 코드]

#include <iostream>
#include <clocale>
#include <cstdlib>
#include <string>
#include <cstring>

int main()
{
        wchar_t wstr[128];
        std::string str = "안녕하세요";

        // 시스템에 설치된 locale 을 확인한다.
        if(!std::setlocale(LC_CTYPE, "ko_KR.utf8")) {
                std::cout << "setlocale fail\n";
                return 1;
        } else {
                //std::wcout.imbue(std::locale("ko_KR.utf8"));
        }

        memset(wstr, 0, sizeof(wstr));
        // 멀티바이트 -> 와이드 캐릭터로
        // 입력 데이터는  utf8 로 인코딩 되어 있어야 한다.
        const auto result = std::mbstowcs(wstr, str.c_str(), 128);

        if (result == (std::size_t)(-1)) {
                std::cout << "fail\n";
        }
        else {
                std::cout << "success " << result << "\n";
                for (int i=0; i<result; i++) {
                        std::cout << int(wstr[i]) << " ";
                }
                std::cout << std::endl;

                // 가급적 std::wcout 과 std::cout 은 혼욯하여 사용하지 않는다.
                //std::wcout << wstr << L"\n";
                //std::wcout.flush();

                char mbstr[128];
                memset(mbstr, 0, sizeof(mbstr));
                // wide char -> utf8 로 변환
                std::wcstombs(mbstr, wstr, 128);
                std::cout << mbstr << std::endl;
        }

        return 0;
}

 


[4. 윈도우 관련 코드]

#include <iostream>
#include <clocale>
#include <cstdlib>
#include <string>
#include <cstring>

// 이 소스코드는 euc-kr 로 인코딩되어야 한다.

int main()
{
        wchar_t wstr[128];
        std::string str = "안녕하세요";

        if(!std::setlocale(LC_CTYPE, "Korean_Korea.949")) {
                std::cout << "setlocale fail\n";
                return 1;
        } else {
            //std::wcout.imbue(korean_locale);
        }

        memset(wstr, 0, sizeof(wstr));
        const auto result = std::mbstowcs(wstr, str.c_str(), 128);

        if (result == (std::size_t)(-1)) {
                std::cout << "mbstowcs fail\n";
        }
        else {
                std::cout << "mbstowcs success " << result << "\n";
                for (int i=0; i<result; i++) {
                        std::cout << int(wstr[i]) << " ";
                }
                std::cout << std::endl;

                char mbstr[128];
                memset(mbstr, 0, sizeof(mbstr));
                std::wcstombs(mbstr, wstr, 128);
                std::cout << mbstr << std::endl;
        }

        return 0;
}

'C++' 카테고리의 다른 글

Placement new  (0) 2025.05.28
wchar_t 사용과 관련하여.  (0) 2025.05.12
std::bind  (0) 2025.04.28
bitfield 사용 시 유의할 점  (0) 2025.04.28
OS 별 select() 함수 사용법  (0) 2025.04.24