Unicode字符集下CString與char *轉(zhuǎn)換
在Visual C++.NET2005中,默認的字符集形式是Unicode,但在VC6.0等工程中,默認的字符集形式是多字節(jié)字符集(MBCS:Multi-Byte Character Set),這樣導致在VC6.0中非常簡單實用的各類字符操作和函數(shù)在VS2005環(huán)境下運行時會報各種各樣的錯誤,這里總結(jié)了在Visual C++.NET2005環(huán)境中Unicode字符集下CString和char *之間相互轉(zhuǎn)換的幾種方法,其實也就是Unicode字符集與MBCS字符集轉(zhuǎn)換。
1、Unicode下CString轉(zhuǎn)換為char *
方法一:使用API:WideCharToMultiByte進行轉(zhuǎn)換
CString str = _T("D:\\校內(nèi)項目\\QQ.bmp");
//注意:以下n和len的值大小不同,n是按字符計算的,len是按字節(jié)計算的
int n = str.GetLength(); // n = 14, len = 18
//獲取寬字節(jié)字符的大小,大小是按字節(jié)計算的
int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);
//為多字節(jié)字符數(shù)組申請空間,數(shù)組大小為按字節(jié)計算的寬字節(jié)字節(jié)大小
char * pFileName = new char[len+1]; //以字節(jié)為單位
//寬字節(jié)編碼轉(zhuǎn)換成多字節(jié)編碼
WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);
pFileName[len+1] = '\0';
方法二:使用函數(shù):T2A、W2A
CString str = _T("D:\\校內(nèi)項目\\QQ.bmp");
//聲明標識符
USES_CONVERSION;
//調(diào)用函數(shù),T2A和W2A均支持ATL和MFC中的字符轉(zhuǎn)換
char * pFileName = T2A(str);
//char * pFileName = W2A(str); //也可實現(xiàn)轉(zhuǎn)換
注意:有時候可能還需要添加引用#include
2、Unicode下char *轉(zhuǎn)換為CString
方法一:使用API:MultiByteToWideChar進行轉(zhuǎn)換
char * pFileName = "D:\\校內(nèi)項目\\QQ.bmp";
//計算char *數(shù)組大小,以字節(jié)為單位,一個漢字占兩個字節(jié)
int charLen = strlen(pFileName);
//計算多字節(jié)字符的大小,按字符計算。
int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);
//為寬字節(jié)字符數(shù)組申請空間,數(shù)組大小為按字節(jié)計算的多字節(jié)字符大小
TCHAR *buf = new TCHAR[len + 1];
//多字節(jié)編碼轉(zhuǎn)換成寬字節(jié)編碼
MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);
buf[len] = '\0'; //添加字符串結(jié)尾,注意不是len+1
//將TCHAR數(shù)組轉(zhuǎn)換為CString
CString pWideChar;
pWideChar.Append(buf);
//刪除緩沖區(qū)
delete []buf;
方法二:使用函數(shù):A2T、A2W
char * pFileName = "D:\\校內(nèi)項目\\QQ.bmp";
USES_CONVERSION;
CString s = A2T(pFileName);
//CString s = A2W(pFileName);
方法三:使用_T宏,將字符串轉(zhuǎn)換為寬字符
//多字節(jié)字符集,在vc6和vc7種可以編譯通過的語句,但VS2005不能通過,默認為Unicode字符集
//AfxMessageBox("加載數(shù)據(jù)失敗",0);
//書寫代碼使用TEXT("")或_T(""),文本在UNICODE和非UNICODE程序里都通用
AfxMessageBox(_T("加載數(shù)據(jù)失敗"),0);
注意:直接轉(zhuǎn)換在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接轉(zhuǎn)換是不可行的,CString會以Unicode的形式來保存數(shù)據(jù),強制類型轉(zhuǎn)換只會返回第一個字符。
本文僅代表作者觀點,版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請在文中注明來源及作者名字。
免責聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請及時與我們聯(lián)系進行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com





