마지막으로 안시와 유니코드 문자열의 간단한 변환은 vc 에서는 A2W(), W2A() 매크로를 이용하는 방법이 있습니다.
atl 매크로를 이용하지만, 매크로이므로 atl 라이버러리와 링크없이 이용할수있는 장점이 있습니다.
atl 매크로를 이용하지만, 매크로이므로 atl 라이버러리와 링크없이 이용할수있는 장점이 있습니다.
#include <atlcore.h>
void MyTest()
{
{
USES_CONVERSION;
std::string s1("abc");
std::wstring s2(A2W(s1.c_str()));
s1 = W2A(s2.c_str());
}std::string s1("abc");
std::wstring s2(A2W(s1.c_str()));
s1 = W2A(s2.c_str());
string(multi-byte string)과 wstring(wide-char string)을 상호 변환하는 방법을 알아보자. 보통 mbstowcs와 wcstombs 함수를 사용하거나 윈도우즈 환경에서는 MultiByteToWideChar와 WideCharToMuliByte 함수를 사용해서 구현하는데 여기서는 STL의 codecvt를 사용해서 구현했다. (codecvt는 문자를 인코딩하는데 사용된다. )
multi-byte string을 wide-char string으로 변환하는 코드
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 = std::mbstate_t(); std::vector<wchar_t> buf(str.size() + 1); char const* in_next = str.c_str(); wchar_t* out_next = &buf[0]; std::codecvt_base::result r = codecvt.in(state, str.c_str(), str.c_str() + str.size(), in_next, &buf[0], &buf[0] + buf.size(), out_next); if (r == std::codecvt_base::error) throw std::runtime_error("can't convert string to wstring"); return std::wstring(&buf[0]); }
wide-char string을 multi-byte string으로 변환하는 코드
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 = std::mbstate_t(); std::vector<char> buf((str.size() + 1) * codecvt.max_length()); wchar_t const* in_next = str.c_str(); char* out_next = &buf[0]; std::codecvt_base::result r = codecvt.out(state, str.c_str(), str.c_str() + str.size(), in_next, &buf[0], &buf[0] + buf.size(), out_next); if (r == std::codecvt_base::error) throw std::runtime_error("can't convert wstring to string"); return std::string(&buf[0]); }
사용 예
// 전역 locale 설정 std::locale::global(std::locale("")); std::string mbs1 = "abcdef가나다라"; std::wstring wcs1 = L"abcdef가나다라"; std::string mbs2 = wcs_to_mbs(wcs1); assert(mbs1 == mbs2); std::wstring wcs2 = mbs_to_wcs(mbs1); assert(wcs1 == wcs2);