VC的字符標準實在是太多了,個人覺得很不爽,就一個CString與char*相互轉換的問題,就搞得不可開交,這也可能和我不怎麼了解VC字符編碼標準有關吧。
char*轉CString,有人說,用這樣一段代碼即可:
CString s = "abcd";
char *p = (LPSTR)(LPCTSTR)s;
還有一段,使用這樣的方法實現的,只是我還是得不到我想要的結果,一如既往是亂碼:
CString str;
char* chain = "我是char*";
str.Format(_T("%s"),chain);
同時,CString轉char*,也用了很多網上的方法,結果還是差強人意。。。。
最後,自己得到的經驗是,CString和char*相互轉換,使用一箇中間字符——TCHAR*可解決,如下是我的一些方法源碼:
char *w2c(wchar_t *lpcwszStr)
{
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum+1];
memset(psText,0,dwNum+1);
if(psText)
{
WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);
return psText;
}
else return NULL;
}
這個方法是用來將TCHAR*轉換成char*的;
wchar_t *c2w(char *lpcszStr)
{
DWORD dwNum = MultiByteToWideChar(CP_OEMCP,NULL,lpcszStr,-1,NULL,0);
wchar_t *psText;
psText = new wchar_t[dwNum+1];
memset(psText,0,dwNum+1);
if(psText)
{
MultiByteToWideChar(CP_OEMCP,NULL,lpcszStr,-1,psText,dwNum);
return psText;
}
else return NULL;
}
這個方法是用來將char*轉換成TCHAR*的;
而CString和TCHAR*之間的轉換通過使用這樣的一個方法就可以實現:
CString str = _T("我是CString");
TCHAR* temp = str.GetBuffer(str.GetLength());
CString str = _T("我是CString");
TCHAR* temp = str.GetBuffer(str.GetLength());
char* dest = w2c(temp);
當char*轉CString時:
char* sourse = "我是char*";
TCHAR* temp = c2w(source);
CString dest;
dest.Format(_T("%s"),temp);