首页 > 代码库 > WideCharToMultiByte和MultiByteToWideChar函数的用法

WideCharToMultiByte和MultiByteToWideChar函数的用法

为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACP和CP_UTF8两个。
使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
下面是代码实现:
1.  ANSI to Unicode

 1 wstring ANSIToUnicode( const string& str ) 2 { 3  int  len = 0; 4  len = str.length(); 5  int  unicodeLen = ::MultiByteToWideChar( CP_ACP, 6             0, 7             str.c_str(), 8             -1, 9             NULL,10             0 ); 11  wchar_t *  pUnicode; 12  pUnicode = new  wchar_t[unicodeLen+1]; 13  memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 14  ::MultiByteToWideChar( CP_ACP,15          0,16          str.c_str(),17          -1,18          (LPWSTR)pUnicode,19          unicodeLen ); 20  wstring  rt; 21  rt = ( wchar_t* )pUnicode;22  delete  pUnicode;23  24  return  rt; 25 }

2.  Unicode to ANSI

 1 string UnicodeToANSI( const wstring& str ) 2 { 3  char*     pElementText; 4  int    iTextLen; 5  // wide char to multi char 6  iTextLen = WideCharToMultiByte( CP_ACP, 7          0, 8          str.c_str(), 9          -1,10          NULL,11          0,12 NULL,13          NULL );14  pElementText = new char[iTextLen + 1];15  memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );16  ::WideCharToMultiByte( CP_ACP,17          0,18          str.c_str(),19          -1,20          pElementText,21          iTextLen,22          NULL,23          NULL );24  string strText;25  strText = pElementText;26  delete[] pElementText;27  return strText;28 }

3.  UTF-8 to Unicode

 1 wstring UTF8ToUnicode( const string& str ) 2 { 3  int  len = 0; 4  len = str.length(); 5  int  unicodeLen = ::MultiByteToWideChar( CP_UTF8, 6             0, 7             str.c_str(), 8             -1, 9             NULL,10             0 ); 11  wchar_t *  pUnicode; 12  pUnicode = new  wchar_t[unicodeLen+1]; 13  memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 14  ::MultiByteToWideChar( CP_UTF8,15          0,16          str.c_str(),17          -1,18          (LPWSTR)pUnicode,19          unicodeLen ); 20  wstring  rt; 21  rt = ( wchar_t* )pUnicode;22  delete  pUnicode;23  24  return  rt; 25 }

4.  Unicode to UTF-8

 1 string UnicodeToUTF8( const wstring& str ) 2 { 3  char*     pElementText; 4  int    iTextLen; 5  // wide char to multi char 6  iTextLen = WideCharToMultiByte( CP_UTF8, 7          0, 8          str.c_str(), 9          -1,10          NULL,11          0,12          NULL,13          NULL );14  pElementText = new char[iTextLen + 1];15  memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );16  ::WideCharToMultiByte( CP_UTF8,17          0,18          str.c_str(),19          -1,20          pElementText,21          iTextLen,22          NULL,23          NULL );24  string strText;25  strText = pElementText;26  delete[] pElementText;27  return strText;28 }

 

WideCharToMultiByte和MultiByteToWideChar函数的用法