轉載鏈接:https://www.cnblogs.com/akb48/p/5439154.html
windows平台
char 表示單字符,占用一個字節
wchar_t 表示寬字符,占用兩個字節
Linux平台
char 占用一個字節
wchar_t 占用四個字節
windows平台下對於用字符串保存中文的問題,GBK和UTF8都是用char來表示,只是為了表示一個中文字符需要用到多個char。而對於UNICODE(其實應該說是UFT16),每一個字符都需要一個兩個字節,也就是用wchar_t表示。
UNICODE只是一個字符集,規定了不同的字符對應於一個唯一的整數,平時所說的使用UNICODE編碼其實說的是UFT16編碼(顧名思義就是用16位來表示一個字符)。
UTF8、UTF16和UFT32則是基於UNICODE字符集的三種編碼方式。不同之處是:對於一個字符所對應的整數,應該怎樣用二進制位表示出來。對於UTF16和UTF32,不管字符對應的數字是多少,都用恆定的多字節表示,所以可以很方便的表示一個字符,但需要注意字節序問題。比較麻煩的是UFT8,對於不同的字符,可能會用到一個字節,兩個字節到最多六個字節。這么做的好處是節省了空間。
在實際使用字符串保存時,因為UTF16不管什么字符,都用2個字節表示,所以可能會出現某一個字節全零的情況。例如字符‘A’編碼是0x41,用UTF16表示就是0x0041。對於char表示的字符串,以0x00表示結尾,所以沒有辦法正確的存儲此類數據,此時只能用wchar_t來保存。
UTF8編碼方式如下:用1~6個字節存儲一個字符,當第一個字節的首位為0時,表示這個字符只用一個字節表示(剛好與ASCII碼一一對應),當用多字節表示一個字符時,首字節以連續的多個1和一個0開始,表示用多個字節。例如用3個字節是,首字節為1110xxxx,后面各字節均以10開始。
UNICODE原碼(16進制) UTF8(2進制)
0000-007F 0xxxxxxx
0080-07FF 110xxxxx 10xxxxxx
0800-FFFF 1110xxxx 10xxxxxx 10xxxxxx
......
如上所示,UTF8中的‘x’就是實際表示字符編碼的位。表示的最大值就是全1的情況,最小值就是少一個字節的情況下最大值加1,因為少一個字節已經可以存的下的字符,不會用多一個字節來保存。由上可知,UTF8可以直接用char類型的字符串來表示,只是用對應的解釋方式來解釋就可以正確顯示了。
另外一種就是GBK等編碼方式。這一類編碼方式和UNICODE沒有任何關系,是另一種字符集和編碼方式的規定。使用方法可以類比於UTF8,在編碼小於128時,就是ASCII,而中文的編碼均大於128,用超過一個字節來表示。在平時編寫的windows程序中,可以理解為如果使用了UNICODE宏,就是在用wchar_t來表示中文,使用UTF16編碼,如果沒有UNICODE宏,那么就是在用GBK,以char來表示中文。
windows平台下的TCHAR類型就是通過宏對char和wchar_t的封裝。可根據當前平台情況選擇對應的類型。_T修飾的字符串常量同理,根據是否定義的UNICODE宏,分別表示""或L""。
Linux平台的不同在於,wchar_t用4個字節表示,也就是UCS-4,而windows用兩個字節,UCS-2。