Unicode下的CString與char 轉換

2021-06-23 00:49:28 字數 3032 閱讀 8861

在vs2005及以上的環境中,所見工程的預設字符集形式是unicode,而vc6.0中,字符集形式為多位元組字符集(mbcs: multi-byte character set),這樣導致了許多字元轉換的方法在unicode的環境中不允許使用,強制型別轉換的結果也會變得非常奇怪。

如lpctstr與char *的轉換,在ansi(vc6.0環境下預設編碼)下,lpctstr == const char*

但在unicode下,lpctstr == const tchar*

在vs2005及以上的環境中,所見工程的預設字符集形式是unicode,而vc6.0中,字符集形式為多位元組字符集(mbcs: multi-byte character set),這樣導致了許多字元轉換的方法在unicode的環境中不允許使用,強制型別轉換的結果也會變得非常奇怪。

如lpctstr與char *的轉換,在ansi(vc6.0環境下預設編碼)下,lpctstr == const char*

但在unicode下,lpctstr == const tchar*

如果覺得轉換麻煩的話,可以直接在新建工程時不選用unicode libraries,或者工程中修改 project->property->configuration properties->general->project defaults->character set,改為use multi-byte character set。(此介面 alt+f7可以直接開啟)

問題就是,如果開發到一半,修改其中的預設編碼方式,程式會變得相當奇怪,而且,有很多字串常量需要去掉"_t()",所以,還是有必要記下unicode中cstring到char *的轉換方法的。

方法1:使用api:widechartomultibyte進行轉換(使用過,有效)

cstring str= cstring("this is an example!");

int n = str.getlength(); //按字元計算,str的長度

int len = widechartomultibyte(cp_acp,0,str,n,null,0,null,null);//按byte計算str長度

char *pchstr = new char[len+1];//按位元組為單位

widechartomultibyte(cp_acp,0,str,n,pchstr,len,null,null);//寬位元組轉換為多位元組編碼

pchstr[len] = '\0';\\不要忽略末尾結束標誌

//用完了記得delete pchstr,防止記憶體洩露

方法2:使用函式:t2a,w2a(未嘗試)

cstring str= cstring("this is an example!");

uses_conversion//宣告標示符

//呼叫函式,t2a和w2a均支援atl和mfc中字元轉換

char *pchstr = t2a(str);

//char *pchstr = w2a(str);//也可以實現轉換

注意:有時候需要包含標頭檔案 #include

詳細的內容參考:

順便記一下各種型別轉為cstring的方法:

cstring str = cstring("this is an example!");

cstring str = _t("this is an ")+"an example";

int x = 9;cstring str; str.format(_t("%d"), x);

double x=9.7, cstring str; str.format(_t("%.3f"),x);

如果覺得轉換麻煩的話,可以直接在新建工程時不選用unicode libraries,或者工程中修改 project->property->configuration properties->general->project defaults->character set,改為use multi-byte character set。(此介面 alt+f7可以直接開啟)

問題就是,如果開發到一半,修改其中的預設編碼方式,程式會變得相當奇怪,而且,有很多字串常量需要去掉"_t()",所以,還是有必要記下unicode中cstring到char *的轉換方法的。

方法1:使用api:widechartomultibyte進行轉換(使用過,有效)

cstring str= cstring("this is an example!");

int n = str.getlength(); //按字元計算,str的長度

int len = widechartomultibyte(cp_acp,0,str,n,null,0,null,null);//按byte計算str長度

char *pchstr = new char[len+1];//按位元組為單位

widechartomultibyte(cp_acp,0,str,n,pchstr,len,null,null);//寬位元組轉換為多位元組編碼

pchstr[len] = '\0';\\不要忽略末尾結束標誌

//用完了記得delete pchstr,防止記憶體洩露

方法2:使用函式:t2a,w2a(未嘗試)

cstring str= cstring("this is an example!");

uses_conversion//宣告標示符

//呼叫函式,t2a和w2a均支援atl和mfc中字元轉換

char *pchstr = t2a(str);

//char *pchstr = w2a(str);//也可以實現轉換

注意:有時候需要包含標頭檔案 #include

vs2010親測可用,個人認為最簡單的一種方法

順便記一下各種型別轉為cstring的方法:

cstring str = cstring("this is an example!");

cstring str = _t("this is an ")+"an example";

int x = 9;cstring str; str.format(_t("%d"), x);

double x=9.7, cstring str; str.format(_t("%.3f"),x);

UNICODE下memset的使用

在多位元組程式中,memset及zeromemory的使用很清楚,如 char str 10 memset str,0,10 或memset str,0,sizeof str zeromemory str,10 或zeromemory str,sizeof str 其中 sizeof str 10 ...

unicode下資料之間的轉換

首先mfc下字串只有兩種資料 char 乙個位元組 和wchar t 兩個位元組 很多其他資料型別如tchar,wchar等都是這個兩個基本型別的巨集定義,byte是uchar 1 對話方塊列印char char info messageboxa this m hwnd,info,mb ok 2 c...

Unicode下CString與char 轉換

在visual c net2005中,預設的字符集形式是unicode,但在vc6.0等工程中,預設的字符集形式是多位元組字符集 mbcs multi byte character set 這樣導致在vc6.0中非常簡單實用的各類字元操作和函式在vs2005環境下執行時會報各種各樣的錯誤,這裡總結了...