멀티바이트 -> 유티코드 하는 함수

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 의 값은 여기 을 참조. 사실 밑의 함수는 MultiByteToWideCharWideCharToMultiByte 를 랩핑한것뿐…..




  1. #include <windows.h>


  2. std::wstring MultiToWide( const char* str, int len = -1, UINT CodaPage = CP_ACP );


  3. std::string  WideToMulti( const wchar_t* str, int len = -1, UINT CodaPage = CP_ACP);


  4.  


  5. std::wstring MultiToWide( const char* str, int len, UINT CodaPage )


  6. {


  7.         // 필요버퍼크기를 구한다.


  8.         int bufSize = MultiByteToWideChar(CodaPage, 0, str, len, NULL, 0);


  9.         int strSize = bufSize;


  10.  


  11.         // len 이 -1 일 경우 마지막 터미널 문자의 개수까지 포함되기때문에


  12.         // 실제 문자열 길이는 1을 뺀다.


  13.         if( len == -1 ) strSize = bufSize-1;


  14.        


  15.         // 실제 문자열 길이가 0 보다 작을 경우 그냥 종료


  16.         if( strSize <= 0 )


  17.                 return std::wstring();


  18.  


  19.         std::vector<wchar_t> wsv(bufSize);


  20.         if( MultiByteToWideChar(CodaPage, 0, str,len, &wsv[0], bufSize) == 0 )


  21.                 return std::wstring();


  22.  


  23.         return std::wstring(wsv.begin(), wsv.begin()+strSize);


  24. }


  25.  


  26. std::string  WideToMulti( const wchar_t* str, int len, UINT CodaPage)


  27. {


  28.         // 필요버퍼크기를 구한다.


  29.         int bufSize = WideCharToMultiByte(CodaPage, 0, str, len, NULL, 0, NULL, NULL);


  30.         int strSize = bufSize;


  31.  


  32.         // len 이 -1 일 경우 마지막 터미널 문자의 개수까지 포함되기때문에


  33.         // 실제 문자열 길이는 1을 뺀다.


  34.         if( len == -1 )


  35.                 strSize = bufSize-1;


  36.  


  37.         // 실제 문자열 길이가 0 보다 작을 경우 그냥 종료


  38.         if( strSize <= 0 )


  39.                 return std::string();


  40.        


  41.         std::vector<char> msv(bufSize);


  42.        


  43.         if( WideCharToMultiByte(CodaPage, 0, str, len, &msv[0], bufSize, NULL, NULL) == 0 )


  44.                 return std::string();


  45.  


  46.         return std::string(msv.begin(), msv.begin()+strSize);


  47. }