All Articles

C++/MFC

std::string to std::wstring

한글 std::string to std::wstring

헤더 파일

// Util.h
#pragma once

#include <string>

namespace Util
{
#ifdef _UNICODE
    std::wstring to_wstring(const std::string& str);
    std::string to_string(const std::wstring& str);
#endif
}

소스 파일

// Util.cpp
#include "Util.h"

#ifdef _UNICODE
std::wstring Util::to_wstring(const std::string& str)
{
    std::wstring buf;
    const int strLength = MultiByteToWideChar(CP_ACP, NULL, str.c_str(), str.size(), nullptr, NULL);
    buf.resize(strLength);
    MultiByteToWideChar(CP_ACP, NULL, str.c_str(), str.size(), const_cast<TCHAR*>(buf.c_str()), strLength);
    return buf;
}

std::string Util::to_string(const std::wstring& str)
{
    std::string buf;
    const int strLength = WideCharToMultiByte(CP_ACP, NULL, str.c_str(), str.size(), nullptr, NULL, nullptr, nullptr);
    buf.resize(strLength);
    WideCharToMultiByte(CP_ACP, NULL, str.c_str(), str.size(), const_cast<char*>(buf.c_str()), strLength, nullptr, nullptr);
    return buf;
}
#endif

테스트

테스트 환경: ReSharper, Google Test, C++14

테스트 소스

// TestProject/test.cpp
#include "../<Target Project>/Util.h"

#ifdef _DEBUG
#pragma comment(lib, "../x64/Debug/<Target Project>.lib")
#else
#pragma comment(lib, "../x64/Release/<Target Project>.lib")
#endif

namespace Converter
{
    TEST(StringConverter, ToWString)
    {
        EXPECT_EQ(std::wstring(L"HELLO"), Util::to_wstring("HELLO"));
        EXPECT_EQ(std::wstring(L"테스트"), Util::to_wstring("테스트"));
        EXPECT_EQ(std::wstring(L"테스트 코드입니다"), Util::to_wstring("테스트 코드입니다"));
    }

    TEST(StringConverter, ToString)
    {
        EXPECT_EQ(std::string("HELLO"), Util::to_string(L"HELLO"));
        EXPECT_EQ(std::string("테스트"), Util::to_string(L"테스트"));
        EXPECT_EQ(std::string("테스트 코드입니다"), Util::to_string(L"테스트 코드입니다"));
    }

    TEST(StringConverter, LongStringConvertToWString)
    {
        EXPECT_EQ(std::wstring(L"테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123"),
               Util::to_wstring("테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123"));
    }

    TEST(StringConverter, LongStringConvertToString)
    {
        EXPECT_EQ(  std::string("테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123"), 
               Util::to_string(L"테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123\n\
                                 테스트123테스트123테스트123"));
    }

    TEST(StringConverter, SpecialCharacterToString)
    {
        EXPECT_EQ(std::string("!@#$%^&*()[]-=+_,./*~`"), Util::to_string(L"!@#$%^&*()[]-=+_,./*~`"));
    }

    TEST(StringConverter, SpecialCharacterToWString)
    {
        EXPECT_EQ(std::wstring(L"!@#$%^&*()[]-=+_,./*~`"), Util::to_wstring("!@#$%^&*()[]-=+_,./*~`"));
    }

    TEST(StringConverter, EmptySpaceToString)
    {
        EXPECT_EQ(std::string(" "), Util::to_string(L" "));
        EXPECT_EQ(std::string("\n"), Util::to_string(L"\n"));
    }

    TEST(StringConverter, EmptySpaceToWString)
    {
        EXPECT_EQ(std::wstring(L" "), Util::to_wstring(" "));
        EXPECT_EQ(std::wstring(L"\n"), Util::to_wstring("\n"));
    }

    TEST(StringConverter, NumericToString)
    {
        EXPECT_EQ(std::string("0123456789"), Util::to_string(L"0123456789"));
    }

    TEST(StringConverter, NumericToWString)
    {
        EXPECT_EQ(std::wstring(L"0123456789"), Util::to_wstring("0123456789"));
    }
}

테스트 결과

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

MFC Dialog 로드 이벤트  (0) 2021.01.25
CImage로 이미지 로드하는 다양한 방법  (0) 2020.09.15