WideCharToMultiByte和MultiByteToWideChar函数的用法(转)
转自: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 // ANSI to Unicode 2 #include <string> 3 using namespace std; 4 wstring ANSIToUnicode( const string& str ) 5 { 6 int len = 0; 7 len = str.length(); 8 // 返回转换后unicode的长度 9 int unicodeLen = ::MultiByteToWideChar( 10 CP_ACP, // 实现ANSI与Unicode之间的转换 11 0, // 12 str.c_str(), // 转码前的数据 13 -1, 14 NULL, 15 0 ); 16 // 申请内存 17 wchar_t * pUnicode; 18 pUnicode = new wchar_t[unicodeLen+1]; 19 // 初始化申请的内存 20 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); 21 ::MultiByteToWideChar( 22 CP_ACP, 23 0, 24 str.c_str(), // 转换前数据 25 -1, 26 (LPWSTR)pUnicode, // 转换后数据 27 unicodeLen ); // 转换长度 28 wstring rt; 29 rt = ( wchar_t* )pUnicode; 30 delete pUnicode; // 删除申请的内存 31 32 return rt; 33 }
2. Unicode to ANSI
// Unicode To ANSI string UnicodeToANSI( const wstring& str ) { char* pElementText; int iTextLen; // wide char to multi char iTextLen = WideCharToMultiByte( CP_ACP, 0, str.c_str(), -1, NULL, 0, NULL, NULL ); pElementText = new char[iTextLen + 1]; memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) ); ::WideCharToMultiByte( CP_ACP, 0, str.c_str(), -1, pElementText, iTextLen, NULL, NULL ); string strText; strText = pElementText; delete[] pElementText; return strText; }
3. UTF-8 to Unicode
//UTF8 To Unicode wstring UTF8ToUnicode( const string& str ) { int len = 0; len = str.length(); int unicodeLen = ::MultiByteToWideChar( CP_UTF8, 0, str.c_str(), -1, NULL, 0 ); wchar_t * pUnicode; pUnicode = new wchar_t[unicodeLen+1]; memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t)); ::MultiByteToWideChar( CP_UTF8, 0, str.c_str(), -1, (LPWSTR)pUnicode, unicodeLen ); wstring rt; rt = ( wchar_t* )pUnicode; delete pUnicode; return rt; }
4. Unicode to UTF-8
// Unicode To UTF8 string UnicodeToUTF8( const wstring& str ) { char* pElementText; int iTextLen; // wide char to multi char iTextLen = WideCharToMultiByte( CP_UTF8, 0, str.c_str(), -1, NULL, 0, NULL, NULL ); pElementText = new char[iTextLen + 1]; memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) ); ::WideCharToMultiByte( CP_UTF8, 0, str.c_str(), -1, pElementText, iTextLen, NULL, NULL ); string strText; strText = pElementText; delete[] pElementText; return strText; }