【整理】MFC下 各種字串型別之間轉換(MSDN及其他寫法)
阿新 • • 發佈:2019-01-30
各個字母代表意義
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; }