Posted on 2008-01-08 11:07
寒蟬 閱讀(36116)
評論(11) 編輯 收藏 引用 所屬分類:
C++讀書筆記
環境:Dev cpp 平臺i386
C++標準中,wchar_t是寬字符類型,每個wchar_t類型占2個字節,16位寬。漢字的表示就要用到wchar_t 。char,我們都知道,占一個字節,8位寬。
其實知道了這個以后,要在wchar_t 和 char兩種類型之間轉換就不難實現了。wchar_t 轉換為char 的代碼如下:
有如下的wchar_t和char變量:
wchar_t w_cn = '中'; char c_cn[2] = {'0'} ;
char *C2W(wchar_t w_cn , char c_cn[2])
{ //following code convert wchar to char
c_cn[0] = w_cn >> 8 ;
c_cn[1] = w_cn ;
c_cn[2] = '\0';
return c_cn ;
}
其中需要注意的是一個16位的wchar_t需要用兩個8位的char來存儲之。我們可以發現另外一個問題,wchar_t的高位字節應該存儲在char數組的低位字節。
(這里沒有仔細研究了,覺得怪怪的)。 這是完成了wchar_t到char的轉化,char到wchar_t的轉換類似。
C++中,你要想這樣:cout<<w_cn<<endl;打印wchar_t,那是不行的。why?我想是wchar_t類型沒有重載<<運算符吧。要顯示,我的方法是:
string cn(c_cn);
cout<<cn<<endl;
這樣就能正確的打印wchar_t字符了。是不是感覺好像做了好多事,但是完成的卻是很簡單的事情?呵呵,其實我也有同感,但是沒有辦法。更簡單的辦法,當然是直接用API(我一個是懶的去找了,二一個自己動手轉換有些東西看的更清楚咯),但是這樣的轉換更靈活,
在實際中應該會用到的。 有了以上的基礎,下面給出wchar_t字符串到char字符串的轉換代碼:
char *W2C(const wchar_t *pw , char *pc)
{
//cout<<*pw<<endl; //這樣是不能正確顯示的,你可以試試看顯示的是什么
*pc++ = *pw >> 8 ;
*pc = *pw ;
return 0 ;
}
char *wstr2cstr(const wchar_t *pwstr , char *pcstr, size_t len)
{ char *ptemp = pcstr ;
if(pwstr!=NULL && pcstr!=NULL)
{ size_t wstr_len = wcslen(pwstr) ;
len = (len > wstr_len ) ? wstr_len : len ;
while( len -- > 0)
{
W2C(pwstr , pcstr);
pwstr++ ;
pcstr +=2 ; //和我們開始說的一樣+2,不是+1
}
*pcstr = '\0';
return ptemp ;
}
return 0 ;
}
對上面的代碼進行測試:
int main(int arg , char *argv[])
{
wchar_t pwstr[] = {'我' , '是' , '中' , '國' , '人'};
char *pcstr = (char *)new char[2 * wcslen(pwstr)+1] ;
memset(pcstr , 0 , 2 * wcslen(pwstr)+1 );
wstr2cstr(pwstr , pcstr , wcslen(pwstr)) ;
str.assign (pcstr);
cout<<str<<endl;
delete []pcstr ;
}