tinyXML 에서 UTF-8 인코딩 때문에 뷁뷁 거리다가 그냥 윈도우에서 제공하는 함수 쓰니 잘동작하더라…
멀티바이트에서 와이드캐릭터 전환 ( MultiToWide( s, len, CP_ACP) )
UFT-8로 인코딩된 멀티바이트에서 와이드캐릭터 전환 ( MultiToWide( s, len, CP_UTF8) )
와이드캐릭터 에서 멀티바이트 전환 ( WideToMulti( s, len, CP_ACP) )
와이드캐릭터에서 UTF-8 로 인코딩된 멀티바이트 전환 ( WideToMulti( s, len, CP_UTF8) )
(…사실 유니코드니 와이드캐릭터니 UTF-8 이니 뭔소린지 잘 모르겠다.)
인자중 CodaPage 의 값은 여기 을 참조. 사실 밑의 함수는 MultiByteToWideChar 와 WideCharToMultiByte 를 랩핑한것뿐…..
#include <windows.h>
std::wstring MultiToWide( const char* str, int len = -1, UINT CodaPage = CP_ACP );
std::string WideToMulti( const wchar_t* str, int len = -1, UINT CodaPage = CP_ACP);
std::wstring MultiToWide( const char* str, int len, UINT CodaPage )
{
// 필요버퍼크기를 구한다.
int bufSize = MultiByteToWideChar(CodaPage, 0, str, len, NULL, 0);
int strSize = bufSize;
// len 이 -1 일 경우 마지막 터미널 문자의 개수까지 포함되기때문에
// 실제 문자열 길이는 1을 뺀다.
if( len == -1 ) strSize = bufSize-1;
// 실제 문자열 길이가 0 보다 작을 경우 그냥 종료
if( strSize <= 0 )
return std::wstring();
std::vector<wchar_t> wsv(bufSize);
if( MultiByteToWideChar(CodaPage, 0, str,len, &wsv[0], bufSize) == 0 )
return std::wstring();
return std::wstring(wsv.begin(), wsv.begin()+strSize);
}
std::string WideToMulti( const wchar_t* str, int len, UINT CodaPage)
{
// 필요버퍼크기를 구한다.
int bufSize = WideCharToMultiByte(CodaPage, 0, str, len, NULL, 0, NULL, NULL);
int strSize = bufSize;
// len 이 -1 일 경우 마지막 터미널 문자의 개수까지 포함되기때문에
// 실제 문자열 길이는 1을 뺀다.
if( len == -1 )
strSize = bufSize-1;
// 실제 문자열 길이가 0 보다 작을 경우 그냥 종료
if( strSize <= 0 )
return std::string();
std::vector<char> msv(bufSize);
if( WideCharToMultiByte(CodaPage, 0, str, len, &msv[0], bufSize, NULL, NULL) == 0 )
return std::string();
return std::string(msv.begin(), msv.begin()+strSize);
}