WideCharToMultiByte和MultiByteToWideChar函数的用法(转载)

时间:2023-02-06 08:43:04

出处:http://www.cnblogs.com/gakusei/articles/1585211.html

为了支持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 }