Blog已遷至 新地址html
windows平臺 git
char 表示單字符,佔用一個字節github
wchar_t 表示寬字符,佔用兩個字節shell
Linux平臺 windows
char 佔用一個字節
wchar_t 佔用四個字節編碼
windows平臺下對於用字符串保存中文的問題,GBK和UTF8都是用char來表示,只是爲了表示一箇中文字符須要用到多個char。而對於UNICODE(其實應該說是UFT16),每個字符都須要一個兩個字節,也就是用wchar_t表示。spa
UNICODE只是一個字符集,規定了不一樣的字符對應於一個惟一的整數,平時所說的使用UNICODE編碼其實說的是UFT16編碼(顧名思義就是用16位來表示一個字符)。.net
UTF八、UTF16和UFT32則是基於UNICODE字符集的三種編碼方式。不一樣之處是:對於一個字符所對應的整數,應該怎樣用二進制位表示出來。對於UTF16和UTF32,無論字符對應的數字是多少,都用恆定的多字節表示,因此能夠很方便的表示一個字符,但須要注意字節序問題。比較麻煩的是UFT8,對於不一樣的字符,可能會用到一個字節,兩個字節到最多六個字節。這麼作的好處是節省了空間。htm
在實際使用字符串保存時,由於UTF16無論什麼字符,都用2個字節表示,因此可能會出現某一個字節全零的狀況。例如字符‘A’編碼是0x41,用UTF16表示就是0x0041。對於char表示的字符串,以0x00表示結尾,因此沒有辦法正確的存儲此類數據,此時只能用wchar_t來保存。blog
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。
參考:
http://www.cnblogs.com/KevinYang/archive/2010/06/18/1760597.html
http://blog.csdn.net/shellching/article/details/5316442