轉(zhuǎn)自http://www.cnblogs.com/gakusei/articles/1585211.html
為了支持Unicode編碼,需要多字節(jié)與寬字節(jié)之間的相互轉(zhuǎn)換。這兩個(gè)系統(tǒng)函數(shù)在使用時(shí)需要指定代碼頁(yè),在實(shí)際應(yīng)用過程中遇到亂碼問題,然后重新閱讀《Windows核心編程》,總結(jié)出正確的用法。
WideCharToMultiByte的代碼頁(yè)用來標(biāo)記與新轉(zhuǎn)換的字符串相關(guān)的代碼頁(yè)。
MultiByteToWideChar的代碼頁(yè)用來標(biāo)記與一個(gè)多字節(jié)字符串相關(guān)的代碼頁(yè)。
常用的代碼頁(yè)由CP_ACP和CP_UTF8兩個(gè)。
使用CP_ACP代碼頁(yè)就實(shí)現(xiàn)了ANSI與Unicode之間的轉(zhuǎn)換。
使用CP_UTF8代碼頁(yè)就實(shí)現(xiàn)了UTF-8與Unicode之間的轉(zhuǎn)換。
下面是代碼實(shí)現(xiàn):
1. ANSI to Unicode
wstring ANSIToUnicode( const string& str )
{
int len = 0;
len = str.length();
int unicodeLen = ::MultiByteToWideChar( CP_ACP,
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_ACP,
0,
str.c_str(),
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode;
return rt;
}
2. 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
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
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;
}