1. 程式人生 > >【整理】MFC下 各種字串型別之間轉換(MSDN及其他寫法)

【整理】MFC下 各種字串型別之間轉換(MSDN及其他寫法)

各個字母代表意義

L 表示long指標,這是為了相容Windows 3.1等16位作業系統遺留下來的,在win32中以及其他的32為作業系統中, long指標和near指標及far修飾符都是為了相容的作用,沒有實際意義。即win32中,long,near,far指標與普通指標沒有區別,LP 與P是等效的。

P 表示這是一個指標。

T 表示_T巨集,這個巨集用來表示你的字元是否使用UNICODE, 如果你的程式定義了UNICODE或者其他相關的巨集,那麼這個字元或者字串將被作為UNICODE字串,否則就是標準的ANSI字串。

STR 表示這個變數是一個字串。

C 表示是一個常量,const。

LPTSTR 如果定義了 UNICODE 巨集則 LPTSTR 被定義為 LPWSTR,否則 LPTSTR 被定義為 LPSTR 

#ifdef UNICODE
    typedef LPWSTR LPTSTR;
    typedef LPCWSTR LPCTSTR;
#else
    typedef LPSTR LPTSTR;
    typedef LPCSTR LPCTSTR;
#endif 

各個型別在多位元組及Unicode下對應型別

/*
型別			MBCS				Unicode

WCHAR			wchar_t				wchar_t
LPSTR			char*				char*
LPCSTR			const char*			const char*
LPWSTR			wchar_t*			wchar_t*
LPCWSTR			const wchar_t*		const wchar_t*
TCHAR			char				wchar_t
LPTSTR			TCHAR*(或char*)		TCHAR* (或wchar_t*)
LPCTSTR			const TCHAR*		const TCHAR*
*/


轉換方法

//LPWSTR->LPTSTR:  
W2T();
//LPTSTR->LPWSTR:   
T2W();
//LPCWSTR->LPCSTR: 
W2CT();
//LPCSTR->LPCWSTR: 
T2CW();
//ANSI->UNICODE:     
A2W();
//UNICODE->ANSI:     
W2A();

為了支援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;
}