先看看這篇關於Windows編碼的文章:http://blog.csdn.net/shyboy_nwpu/article/details/4431668
再看看這篇關於兩個函數參數和用法的說明:http://www.cnblogs.com/wind-net/archive/2012/10/10/2718340.html
為了支持Unicode編碼,需要多字節與寬字節之間的相互轉換。這兩個系統函數在使用時需要指定代碼頁。
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 return rt; 24 }
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 return rt; 24 }
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 29 }