VC6裡字元編碼是用MBCS(Multi-Byte Chactacter System),char型別實際上就是一個8 bit的空間,中文字元“個”在VC6裡佔用2個char,2位元組,s1指向的記憶體上的資料為(10111000, 11110110),如果用十進位制表示也就是(184, 246)。MBCS的話一個字元佔用的空間不是定長,如果是ASCII碼則是8 bit,GBK漢字則是16 bit。ASCII碼的範圍用十進位制表示是[0, 127],單位元組字元,用來表示英語字母以及數字還有其他一些符號。GBK漢字是雙位元組字元,前8 bit範圍是[129, 254](DEC),後8 bit範圍是[64, 254](DEC)。可以看到這中西字元編碼是互不交叉的,printf的東西全送進螢幕緩衝區裡,程式讀取螢幕緩衝區上“個”的前8 bit,也就是184(DEC),發現不在單位元組字元碼錶(ASCII碼錶範圍是[0, 127](DEC),184>127)內,就知道這不是個單位元組字元。所以指標下移,往後再讀8 bit,讀到246(DEC),兩個位元組一共16 bit,拿去GBK漢字碼表查,查有此字,就顯示出來。判斷是漢字還是字母的方法,當然就是根據該位元組值所處的範圍來判斷是單位元組字元(字母&阿拉伯數字&其他半形/通訊符號)還是雙位元組字元(漢字等等)。我簡單寫個程式方便大家理解:
VC6裡字元編碼是用MBCS(Multi-Byte Chactacter System),char型別實際上就是一個8 bit的空間,中文字元“個”在VC6裡佔用2個char,2位元組,s1指向的記憶體上的資料為(10111000, 11110110),如果用十進位制表示也就是(184, 246)。MBCS的話一個字元佔用的空間不是定長,如果是ASCII碼則是8 bit,GBK漢字則是16 bit。ASCII碼的範圍用十進位制表示是[0, 127],單位元組字元,用來表示英語字母以及數字還有其他一些符號。GBK漢字是雙位元組字元,前8 bit範圍是[129, 254](DEC),後8 bit範圍是[64, 254](DEC)。可以看到這中西字元編碼是互不交叉的,printf的東西全送進螢幕緩衝區裡,程式讀取螢幕緩衝區上“個”的前8 bit,也就是184(DEC),發現不在單位元組字元碼錶(ASCII碼錶範圍是[0, 127](DEC),184>127)內,就知道這不是個單位元組字元。所以指標下移,往後再讀8 bit,讀到246(DEC),兩個位元組一共16 bit,拿去GBK漢字碼表查,查有此字,就顯示出來。判斷是漢字還是字母的方法,當然就是根據該位元組值所處的範圍來判斷是單位元組字元(字母&阿拉伯數字&其他半形/通訊符號)還是雙位元組字元(漢字等等)。我簡單寫個程式方便大家理解:
讓我們來看看結果:所以我們還可以這樣玩:MBCS根據碼錶來看可以說是中英文無歧義的,因此可以區分該顯示中文還是英文。