一.兩種字符集
多字節字符集(MBCS):因為計算機最早是在英語國家誕生的,大多數英文信息是由英文字母、數字以及一些其它字符構成了一個128個字符的ASCII字符集。本來這對於英語國家來說夠用了。但是隨着計算機的普及,非英語國家的文字字符也需要用計算機來存儲,這時字符集就需要一種擴展機制了。一種簡單的擴展機制就是兼容ASCII字符集,在后面加上自己的編碼。可以想象,不同字符的編號長度是不一樣的,有些是兩個字節,有些是三個字節甚至四個字節等等。這樣的字符集就叫多字節字符集。多字節字符集就是多種字符集的統稱,比如中文字符集GB2312和GBK、日文編碼JIS都是多字節字符集.些使用多個字節來代表一個字符的各種漢字延伸編碼方式,稱為 ANSI 編碼
UNICODE(萬國碼):由於多字節字符遵循的是各個國家的編碼,要進行信息交換必須進行繁瑣的轉換。這時就有人想:有沒有一種編碼規則,能給全世界的字符都編上統一的編號呢?就這樣unicode字符集誕生了。unicode字符集顧名思義就是每個字符都有一個唯一的編碼。最早的unicode字符是采用兩個字節也是16位對字符進行編碼(也就是能夠對65536個字符進行編號),故被稱為utf-16。后來發現大多信息都是英文構成的,為了節省空間,同時為了兼容單字節的處理系統,就出現了一種變種的unicode字符集——utf8。utf8的實現原理和多字節字符集一樣,前面是128個子符是ASCII字符,后面的采用變長的編碼方式,就是一個字符可能用兩個字節、三個字節或四個字節進行編碼。再到后面發現16位的編碼也不夠用了,采用32位編碼,這樣就出現了utf-32:
二.c++中的常見的數據類型
char 是C語言標准數據類型,字符型。通常由編譯器決定一個char對象有多少個字節組成,一般是一字節。(ansi字符集)
LPSTR(char*) LPCSTR(const char*)
wchar_t 是char的Unicode版本。相當於 unsigned short。一般兩個字節。(unicode字符集)
LPWSTR(wchar_t*) LPCWSTR(const wchar_t*)
CHAR 參照定義: typedef char CHAR;
WCHAR 參照定義:typedef wchar_t WHAR;
TCAHR 通用版字符類型:在ANSI編譯方式下為 char , 在Unicode 編譯方式下為 wchar_t(這種是一種通用型的字符集,在不同的字符系統中有不同的作用,wcsxxxx是unicode版本的操作函數) LPTSTR(CHAR*)
CString 類是微軟的visual c++提供的MFC里面的一個類,所以只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用標准C++中的 string類了。另外,因為string類是在c++標准庫中,所以它被封裝在了std命名空間中,使用之前需要聲明using namespace std;而CString類並不在std命名空間中,因為它不是c++的標准庫,只是微軟的一個封裝庫。這點看來用string類的程序的移植性更好。
三.數據類型之間的轉換
萬能的轉換方法:TEXT(),這種方法會檢測系統現在的字符集然后自動的做出編碼的選擇.
ANSI轉換為寬字節:可以在字符串的前面加上"L";或是_T()
cstring和char*的相互轉換:
cstring->char*:
CString a=L"HAH"; CStringA temp=str; char * pp=temp.GetBuffer();
char*->cstring:直接用cstring的構造函數即可:a=CString("hahha");
string 和cstring 要以char*為橋梁!!