VS C++開發問題總結

1、新建的MFC 對話框CString和char*的轉換一直失敗(vs工程默認配置)

在網上看了很多CString轉char*的方法,但是轉換一直失敗,例如以下幾種方式

CString m_IPADDR = "192.168.1.100";
char* ipaddr = (LPSTR)(LPCTSTR)m_IPADDR;
//或者
strcpy(char *,CString);

以上兩種編譯都是沒有問題,但是傳參總是隻傳第一個字符即“1”,頭大的很,後面才發現原來是編碼格式選擇問題。

因爲默認新建的vs工程默認工程使用的字符集是“使用Unicode字符集”,選擇多字符集就搞定了。

自己理解:MFC中Ctring,默認採用unicode編碼,而char採用ansi編碼,兩種編碼中單個字符佔的存儲大小也是不同的,CString屬於所謂的寬字符集,佔一個字符佔兩個字節;char類型屬於窄字符集,一個char字符佔一個字節,所以它們之間的轉換涉及到字節大小的轉換。

對於ANSI編碼而言,0x00~0x7F之間的字符,依舊是1個字節代表1個字符。這一點是ANSI編碼與Unicode編碼之間最大也最明顯的區別。爲使計算機支持更多語言,通常使用 0x80~0xFF 範圍的多個字節來表示 1 個字符。

UNICODE是計算機科學領域裏的一項業界標準,包括字符集、編碼方案等。Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每個字符設定了統一併且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。

當然如果堅持用unicode編碼也可以用如下方法實現CString和char*的轉換:

//實現unicode編碼格式下的CString和char*的轉換
//#include <afxpriv.h>
CString m_IPADDR= _T("192.168.1.100");
USES_CONVERSION;
char* ipaddr = T2A(m_IPADDR);

順便一提:“_T”的含義:_T是一個宏,作用是讓你的程序支持Unicode編碼。因爲Windows使用兩種字符集ANSI和UNICODE,前者就是通常使用的單字節方式,但這種方式處理像中文這樣的雙字節字符不方便,容易出現半個漢字的情況。而後者是雙字節方式,方便處理雙字節字符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章