程序如何區分該顯示中文字元或英語字元?

先看圖片:

我疑惑的是關於【%c%c】的部分,因為對printf函數來說,無論是【*s】還是【*(s+1)】,不過就是傳遞進來的兩個形參數值而已。那麼printf又是如何區分在【%c%c】這塊,究竟是顯示兩個字元,還是應該輸出一個漢字呢?


因為「個」在你的文件源碼裡面是兩個位元組 B8 F6。


printf兩次都是輸出兩個字元,第一次輸出了xb8 xf6,第二次輸出的是x70 x70

至於把連續的xb8 xf6顯示成「個」,x70顯示成p,這是終端(具體到你這,是Windows的命令行子系統)乾的事情,和printf無關


程序直接往緩衝區里寫ascii碼,屏幕會根據寫入的值來顯示對應的字元,並不存在什麼判斷是漢字還是字母

你可以試著把兩個%c分開輸出,中間隔幾秒,你會發現屏幕先顯示出了一個亂碼,然後才是一個漢字

還有別vc6


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漢字碼表查,查有此字,就顯示出來。

判斷是漢字還是字母的方法,當然就是根據該位元組值所處的範圍來判斷是單位元組字元(字母阿拉伯數字其他半形/通信符號)還是雙位元組字元(漢字等等)。

我簡單寫個程序方便大家理解:

#include &
int main(){
char char1 = 184;
char char2 = 246;
printf(" Print1:
");
printf("%c", char1);//ASCII碼錶外,後續無效單位元組字元
printf("
");
printf("%c", char2);//無效單位元組字元

printf("
Print2:
%c%c
",char1 , char2);

printf(" Print3:
");
printf("%c", char1);
printf("%c", char2);

return 0;
}

讓我們來看看結果:

所以我們還可以這樣玩:

#include &
#include &//VC退散

int main(){
char hexchar[19] = {0xc1,0xd6,0xb2,0xd3,0xb1,0xf3,0x2c,0x20,0x49,0x20,0x4c,0x6f,0x76,0x65,0x20,0x59,0x6f,0x75,0x21},i;
for(i=0;i&<19;i++){ printf("%c", hexchar[i]); _sleep(300); } return 0; }

MBCS根據碼錶來看可以說是中英文無歧義的,因此可以區分該顯示中文還是英文。


首先禮貌謝邀。

表明態度:

我不會吐槽你用vc6

我不會吐槽你書不好什麼的

原因:

每個人都有小白的時候么,尤其現在大一開學將近,學長一定要好好「關照」各位親愛的學弟學妹的~

怒答之!

這個問題么,

首先你要知道什麼是編碼啦~(≧▽≦)/~

這個問題涉及到「字元編碼」,「字符集」這個概念。

https://en.m.wikipedia.org/wiki/Character_encoding

維基中文由於眾所周知的原因,在我這裡掛掉了,對付看吧,實在不行百度百科,雖然說的亂七八糟的。

上圖是ASCII表

http://zh.cppreference.com/w/c/language/ascii

關於printf的格式化輸入輸出,嗯,感覺說了你現在也不會懂的。

給你鏈接自己看吧,還可以在線調試,不錯的。

http://en.cppreference.com/w/c/io/fprintf

這網站還是不錯的。


推薦閱讀:

字元在內存中最終的表示形式是什麼?是某種字元編碼還是碼位(Code Point)?
要往 Unicode 里添加符號需要經過什麼樣的流程?
給在美國的外國人發郵件,郵件中出現的漢字能正常顯示嗎?
Microsoft開發記事本的團隊,是不是使用了一個非常弱智的行為來保存UTF-8編碼的文件?

TAG:Unicode統一碼 | 字元編碼 | C語言入門 |