마지막으로 안시와 유니코드 문자열의 간단한 변환은 vc 에서는
A2W (),
W2A () 매크로를 이용하는 방법이 있습니다.
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());
}
string(multi-byte string)과 wstring(wide-char string)을 상호 변환하는 방법을 알아보자. 보통 mbstowcs와 wcstombs 함수를 사용하거나 윈도우즈 환경에서는
MultiByteToWideChar 와
WideCharToMuliByte 함수를 사용해서 구현하는데 여기서는 STL의 codecvt를 사용해서 구현했다. (codecvt는 문자를 인코딩하는데 사용된다. )
multi-byte string을 wide-char string으로 변환하는 코드
Copy
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으로 변환하는 코드
Copy
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 ]);
}
사용 예
Copy
// 전역 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);