string(multi-byte string) 과 wstring(wide-char string) 을 상호 변환하는 방법을 알아보자. 보통 mbstowcs 와 wcstombs 함수를 사용하거나 윈도우즈 환경에서는 MultiByteToWideChar 와 WideCharToMuliByte 함수를 사용해서 구현하는데 여기서는 STL 의 codecvt 를 사용해서 구현했다. (codecvt 는 문자를 인코딩하는데 사용된다. )
multi-byte string을 wide-char string으로 변환하는 코드 (Language : cpp)
( Language : cpp) 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 ] ) ;}
wide-char string을 multi-byte string으로 변환하는 코드 (Language : cpp)
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 ] ) ;}
사용 예 (Language : cpp)
// 전역 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) ;