對於windows下的wchar, tchar以及其轉換函式, 比較煩人! 不過沒有辦法, 罵完了還是得總結總結, 把學習到的東西寫下來, 以備後用.
字元編碼的知識可以從維基裡獲得,UTF-16也就是Unicode,到ANSI也就是通常的一位元組英文字元,在轉換的時候的標誌是CP_ACP : CodePageAnsiCodePage
1 簡單的不包括中文的widechar字串轉化為普通的char.
CString str("2012 0625");int nYear = 1, nMonth = 1, nDate = 1;swscanf(str.GetBuffer(), _T("%d %d"), &nYear, &nMonth);str.ReleaseBuffer();char charstring[1024];ZeroMemory(charstring,sizeof(charstring));WCHAR *wcharstring=str.GetBuffer();WideCharToMultiByte(CP_ACP,NULL,wcharstring,-1,charstring,1024,NULL,NULL);MultiByteToWideChar(CP_ACP,NULL,charstring,-1,wcharstring,1024);str.ReleaseBuffer();sscanf(charstring, ("%d %d"), &nYear, &nMonth);
2. 使用MultiByteToWideChar的時候要注意,因為我們不知道轉出來的長度是多長,需要先傳輸出長度為0進去,這個函數返回的是轉換會輸入的以WideChar為單位的長度;然後根據傳回值動態開闢記憶體來存放這些輸出資料,再次調用此函數,傳進正確的輸出長度,才能確保沒有字元緩衝區問題發生。
char ansichar[] = "ansistring";TCHAR *pUtf16 = 0;TCHAR myTest[64] = {0};int k = MultiByteToWideChar(CP_ACP,0,ansichar,-1,pUtf16,0);pUtf16 = new TCHAR[k];MultiByteToWideChar(CP_ACP,0,ansichar,-1,pUtf16,k);
注意,這裡分配的空間不需要分配k+1個,因為這個函數已經把最後的\0也算進去做字串的個數。