ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • codecvt 을 이용한 std::string <-> std::wstring 상호 변환 (utf8)
    카테고리 없음 2018. 3. 1. 01:13
    728x90

    먼저 이걸 해주고

    std::local::global(std::locale("")); 
    std::wstring
    mbs_to_wcs(std::string const& str, std::locale const& loc = std::locale(""))
    {
        typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_t;
        codecvt_t const& codecvt = std::use_facet<codecvt_t>(loc);
        std::mbstate_t state = 0;
        std::vector<wchar_t> buf(str.size() + 1);
        char const* in_next = str.c_str();
        wchar_t* out_next = &buf[0];
        codecvt_t::result r = codecvt.in(state,
            str.c_str(), str.c_str() + str.size(), in_next,
            &buf[0], &buf[0] + buf.size(), out_next);
        return std::wstring(&buf[0]);
    }
    
    
    std::string
    wcs_to_mbs(std::wstring const& str, std::locale const& loc = std::locale(""))
    {
        typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_t;
        codecvt_t const& codecvt = std::use_facet<codecvt_t>(loc);
        std::mbstate_t state = 0;
        std::vector<char> buf((str.size() + 1) * codecvt.max_length());
        wchar_t const* in_next = str.c_str();
        char* out_next = &buf[0];
        codecvt_t::result r = codecvt.out(state,
            str.c_str(), str.c_str() + str.size(), in_next,
            &buf[0], &buf[0] + buf.size(), out_next);
        return std::string(&buf[0]);
    }

     

    이건 std::string (utf8) 저장된 데이터를 wstring 으로 변환하는 코드

    std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
    std::wstring ret = conv.from_bytes( input_str );

    근데 C++17 에 deprecated 크리먹음 ㅠㅠ

    728x90

    댓글

Designed by Tistory.