Unicode下CString與char 轉換

2021-07-01 19:20:29 字數 3498 閱讀 9775

unicode下cstring與char *轉換

在visual c++.net2005中,預設的字符集形式是unicode,但在vc6.0等工程中,預設的字符集形式是多位元組字符集(mbcs:multi-byte character set),這樣導致在vc6.0中非常簡單實用的各類字元操作和函式在vs2005環境下執行時會報各種各樣的錯誤,這裡總結了在visual c++.net2005環境中unicode字符集下cstring和char *之間相互轉換的幾種方法,其實也就是unicode字符集與mbcs字符集轉換。

(1)、unicode下cstring轉換為char *

方法一:使用api:widechartomultibyte進行轉換

cstring str = _t("d:\\校內專案\\qq.bmp");

//注意:以下n和len的值大小不同,n是按字元計算的,len是按位元組計算的

int n = str.getlength();     // n = 14, len = 18

//獲取寬位元組字元的大小,大小是按位元組計算的

int len = widechartomultibyte(cp_acp,0,str,str.getlength(),null,0,null,null);

//為多位元組字元陣列申請空間,陣列大小為按位元組計算的寬位元組位元組大小

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

//寬位元組編碼轉換成多位元組編碼

widechartomultibyte(cp_acp,0,str,str.getlength(),pfilename,len,null,null);

pfilename[len+1] = '\0';   //多位元組字元以'\0'結束

方法二:使用函式:t2a、w2a

cstring str = _t("d:\\校內專案\\qq.bmp");

//宣告識別符號

uses_conversion;

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

char * pfilename = t2a(str);  

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

注意:有時候可能還需要新增引用#include  

(2)、unicode下char *轉換為cstring

方法一:使用api:multibytetowidechar進行轉換

char * pfilename = "d:\\校內專案\\qq.bmp";

//計算char *陣列大小,以位元組為單位,乙個漢字佔兩個位元組

int charlen = strlen(pfilename);

//計算多位元組字元的大小,按字元計算。

int len = multibytetowidechar(cp_acp,0,pfilename,charlen,null,0);

//為寬位元組字元陣列申請空間,陣列大小為按位元組計算的多位元組字元大小

tchar *buf = new tchar[len + 1];

//多位元組編碼轉換成寬位元組編碼

multibytetowidechar(cp_acp,0,pfilename,charlen,buf,len);

buf[len] = '\0'; //新增字串結尾,注意不是len+1

//將tchar陣列轉換為cstring

cstring pwidechar;

//刪除緩衝區

delete buf;

方法二:使用函式:a2t、a2w

char * pfilename = "d:\\校內專案\\qq.bmp";

uses_conversion;

cstring s = a2t(pfilename);

//cstring s = a2w(pfilename);

方法三:使用_t巨集,將字串轉換為寬字元

//多位元組字符集,在vc6和vc7種可以編譯通過的語句,但vs2005不能通過,預設為unicode字符集

//afxmessagebox("載入資料失敗",0);

//書寫**使用text("")或_t(""),文字在unicode和非unicode程式裡都通用

afxmessagebox(_t("載入資料失敗"),0); 

注意:直接轉換在基於mbcs的工程可以,但在基於unicode字符集的工程中直接轉換是不可行的,cstring會以unicode的形式來儲存資料,強制型別轉換只會返回第乙個字元。

unicode下

cstring轉tchar

tchar* szmsg = new tchar[wcslen(stradbcmd)];  

szmsg = stradbcmd.getbuffer(stradbcmd.getlength());

stradbcmd.releasebuffer();

用完了別忘了delete szmsg;

cstring轉 char*

char * charp;

cstring strp;

widechartomultibyte(cp_oemcp,0,(lpctstr)strp,-1,charp,260,0,false);

char* tchar*轉 cstring

char cstr[20]=」sdaww」;

tchar tcstr[20]=_t(」unicode」);

cstring str=cstring(cstr);

cstring str1=cstring(tcstr);

cstring轉 int

cstring strnum=_t(「」);

int value = _ttoi(static_cast(strnum));

或者int value = _ttoi(strnum);

int 轉cstring

int ia=1232;

cstring stri= stri.format(_t(「%d」),ia);

多位元組字符集下

cstring轉化為char

轉化成陣列:

cstring   str=」convert」;

char char_str [512];

strncpy_s(char_str,(lpctstr)str_sum,sizeof(char_str));

轉化成char指標:

char * ch_a =(char*)str.getbuffer(str.getlength());

char轉化為cstring

cstring str;

char szbuff[2048];

str.format("%s",szbuff);

cstring 轉 int :

n=atoi(str);

Unicode下CString與char 轉換

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

UniCode下CString轉char 的方法

1unicode下cstring轉換為char 2unicode下char 轉換為cstring 今天進行檔案操作時,將cstring的getbuffer 後直接倒到char陣列後寫入檔案發現 每個字元與字元之間都有乙個空格存在,而且有內容丟失。原來cstring類物件getbuffer 後以後還是...

Unicode下的CString與char 轉換

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