百度了半天,大家的介紹很多,但是發現不全面,一直解決不了問題,綜合下自己的情況分享下自己的解決辦法。
首先網上最常見的轉換是這樣的:
CString str("Test");
char *p=(LPSTR)(LPCTSTR)str;
或者
char *p=(char *)(LPCTSTR)str;
以上的方法不會報錯,但是忽略了一個問題,那就是你的編譯環境是怎樣的,如果你是UNICODE,那麼存儲字符串時是兩個字節兩個字節的,這樣強制轉換會出現亂碼的,特別是數字字符串的時候,直接就被截斷了,例如:“12345”, 通過上面的轉換後存入p裏面的值只有“1“,因爲內存裏面兩字節的1後兩位是0,就相當於字符串結束了。
以下是自己的解決辦法,希望對大家有用:
CString str;
#ifdef UNICODE
wchar_t *lp = (LPTSTR)(LPCTSTR)str; //如果是unicode編碼 要先轉換爲兩字節類型的字符串
char cp[256]; //這兒簡單操作就不動態分配了
int len= WideCharToMultiByte(CP_ACP,0,lp,wcslen(lp),NULL,0,NULL,NULL); //寬字節變爲單字節
WideCharToMultiByte(CP_ACP,0,lp,wcslen(lp),cp,len,NULL,NULL);
cp[len]='\0';
#else
char *sp = (LPSTR)(LPCTSTR)str; //如果是單字節的可以直接這麼使用
#endif
以下對轉換的過程做一下封裝免得每次都要寫一大段代碼:
//CString轉換爲char * 注意CString已確定爲unicode編碼
char * CString2Char(CString str)
{
wchar_t *temp = (LPTSTR)(LPCTSTR)str;//獲得的是CString的地址,不能修改指向的值
return WChar2Char(temp);
}
//線程不安全 不能多線程調用
char * WChar2Char(wchar_t *str)
{
/*因爲返回的內存要不停的申請與釋放,而且釋放很不方便,
這兒用局部靜態變量,但由於長度限制爲10240字節,使用時
要小心,當長度大於10240時要適當做擴展*/
static char p[10240];//10k
memset(p, 0, sizeof(char)*10240);//p會保留上次的結果,這兒最好初始化一下
int len= WideCharToMultiByte(CP_ACP,0,str,wcslen(str),NULL,0,NULL,NULL);
if (len >= 10240)
return NULL;
WideCharToMultiByte(CP_ACP,0,str,wcslen(str),p,len,NULL,NULL);
p[len]='\0';
return p;
}
這樣上面的代碼就可以簡化了,以後調用也方便多了
CString str;
char *p;
#ifdef UNICODE
p = CString2Char(str);
#else
p = (LPSTR)(LPCTSTR)str;
#endif