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