MFC CString型別轉換 Unicode意識

2021-06-19 16:44:12 字數 2563 閱讀 4486

新手用vs2010編寫乙個mfc工具所遇到的問題。

在之前做mfc用的都是用vc6,沒有遇到太多問題,鑑於不太喜歡思考原因,所以一直糊里糊塗的用,現在想想,vc6新建mfc工程時應該預設的是非unicode編碼吧。而vs2010編寫乙個mfc預設的是unicode的編碼。

unicode編碼時cstring預設的是雙位元組的型別,也就是cstring是與wchar_t* 相互轉化,當我們傳入char[ ]或char*時可能自動轉換成雙位元組型別,也可能需要我們手動來轉換,否則會報錯,此時_t()也是有很大作用的(關於_t()在下文介紹)。當我們要將cstring字元寫入檔案時,也要注意將其轉換成char型別,以便可以直觀的查閱,當然也可以不轉,看起來就比較費事了,讀取的時候也要記得是unicode的編碼型別。

非unicode編碼時,cstring是與char*可較為直接的相互轉化,一般常用有2種方式:

1. cstring strfilename; 

lpstrlpstr = strfilename.getbuffer();

strfilename.releasebuffer();

2.cstring strfilename;

lpstrlpstr = (lpstr)(lpcstr)strfilename;

lpstr和lpwstr(unicode編碼時)是win32和vc++所使用的一種字串資料型別。lpstr被定義成是乙個指向以null(『\0』)結尾的32位ansi字元陣列指標,而lpwstr是乙個指向以null結尾的64位雙位元組字元陣列指標。cstring與lpstr轉換。

'l'代表long,'p'代表pointer(指標),'str'表示string。

在msdn中typedef lpstr char*;

cstring s;

s.format(_t("%d"),total);

我總是對我的字串使用_t()巨集,這是為了讓我的**至少有unicode的意識,當然,關於unicode的話題不在這篇文章的討論範圍。_t()巨集在8位字元環境下是如下定義的:

#define _t(x) x // 非unicode版本(non-unicode version)

而在unicode環境下是如下定義的:

#define _t(x) l##x // unicode版本(unicode version)

所以在unicode環境下,它的效果就相當於:

s.format(l"%d",total);

也就是說_t()的使用讓**有unicode的意識,不論在unicode還是非unicode的環境下都不至於出錯。平時編碼有

unicode的意識,

可以用一些方法來隱藏unicode的一些細節,比如在我需要獲得字元長度的時候,我會用乙個叫做dim的巨集,這個巨集是在我的dim.h檔案中定義的,我會在我寫的所有程式中都包含這個檔案:

#define dim(x) (sizeof((x)) / sizeof((x)[0]))(此段摘自別處,覺得有用就貼上便於自己學習)

若要將unicode編碼型別的cstring轉換成char*或將char*轉換成cstring,這裡提供一段**

將char*轉換成unicode編碼型別的cstring

int smgcmdfactory::multibytetowchar(const char* pbuf, cstring& csbuf)

wchar_t* pwbuf = csbuf.getbuffer(dwminsize);

dwminsize = multibytetowidechar (cp_acp, 0, pbuf, nmsgbodylen, pwbuf, dwminsize);

if (dwminsize == 0)

csbuf.releasebuffer();

return dwminsize;

}

將unicode編碼型別的cstring轉換成char*

int smgcmdfactory::wchartomultibyte(cstring& csbuf, char** pbuf) 

return 0;

}

釋放上面函式開闢的空間函式

void smgcmdfactory::cmdfactoryfree(void *pmsgbody)

舉例:

char* preq = null;

cstring csreq = _t("aaaaaaa");

int nret = wchartomultibyte(csreq, &preq);

if (nret != 0)

cmdfactoryfree(preq);

MFC CString型別轉換

1 cstring 物件的連線 能體現出 cstring 型別方便性特點的乙個方面就字串的連線,使用 cstring 型別,你能很方便地連線兩個字串,正如下面的例子 cstring gray gray cstring cat cat cstring graycat gray cat 要比用下面的方法...

MFC CString 轉換成CHAR陣列

由於結構體中用到聯合體 聯合體需要確定分配記憶體分配大小 或其它因素,需要用char陣列來儲存字串,但是在mfc中一般都是用cstring來存放字條串。關於它們之間的轉換,在vs2008中有時會出現異常情況。在msdn是這樣寫的 cstring orig hello,world convert to...

mysql型別轉換c 型別轉換 C 型別轉換

一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...