1. 調用 WideCharToMultiByte() API
int WideCharToMultiByte (
UINT CodePage, //1 Unicode編碼的字符頁,Unicode編碼有字符頁的概念,比如gb2312/936,big5/950等
DWORD dwFlags, //2 如何處理復合unicode字符,詳細查google
LPCWSTR lpWideCharStr, //3 待轉換的unicode串
int cchWideChar, //4 表示參數3的長度 傳遞-1表示以0x00結尾
LPSTR lpMultiByteStr, //5 接受轉換后的串的字符緩沖
int cbMultiByte, //6 表示參數5lpMutiByteStr的字節大小 通常sizeof一下
LPCSTR lpDefaultChar, //7 NULL 具體google
LPBOOL lpUsedDefaultChar//8 NULL 具體google
);
2. 調用CRT函數wcstombs()
size_t wcstombs (
char* mbstr,
const wchar_t* wcstr,
size_t count );
3. 使用CString構造器或賦值操作
// 假設有一個Unicode串wszSomeString
CString str1 ( wszSomeString ); // 用構造器轉換
CString str2;
str2 = wszSomeString; // 用賦值操作轉換
4. 使用ATL串轉換宏
#include <atlconv.h>
// 還是假設有一個Unicode串wszSomeString
{
char szANSIString [MAX_PATH];
USES_CONVERSION; // 聲明這個宏要使用的局部變量
lstrcpy ( szANSIString, OLE2A(wszSomeString) );
}
隨筆- 45 文章- 98 評論- 24
為了支持Unicode編碼,需要多字節與寬字節之間的相互轉換。這兩個系統函數在使用時需要指定代碼頁,在實際應用過程中遇到亂碼問題,然后重新閱讀《Windows核心編程》,總結出正確的用法。
WideCharToMultiByte的代碼頁用來標記與新轉換的字符串相關的代碼頁。
MultiByteToWideChar的代碼頁用來標記與一個多字節字符串相關的代碼頁。
常用的代碼頁由CP_ACP和CP_UTF8兩個。
使用CP_ACP代碼頁就實現了ANSI與Unicode之間的轉換。
使用CP_UTF8代碼頁就實現了UTF-8與Unicode之間的轉換。
下面是代碼實現:
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;
}
