對漢字字元的統計

kewlgrl發表於2015-06-15

以GB2312為標準,說一下我對漢字字元統計的一點認識。


ASCII碼:一個字元佔一個位元組,以0開頭;

中文字元:一個漢字佔兩個位元組,以1開頭。


ASCII碼的161-255這中間94個字元很少用,所以用來作為中文字元的編碼。但是中文漢字很多,遠不止94個,所以我們用94*94=8836個足夠來表示日常生活中常用的漢字。


對於漢字的統計,我一開始採用了以下的方法,比較簡單易行,可以用來做要求不高漢字不難的簡單統計,但是容易出Bug。


因為漢字從0xA0開始編碼,其中0xA0即160,在其後包括有中文的標點符號,也算在漢字字符集中。所以我們可以直接考慮用

int ch,count=0;

分別代表漢字的位元組和對漢字的計數。

將讀取到的漢字位元組直接與0xA0作比較

if (ch>0xA0)
count++;

但是要注意,漢字字元佔倆位元組阿,所以最後要

count/=2;

你以為這就完事兒了?怎麼可能!


還有還有還有!!


我們木有考慮到一個問題:

如果所統計的目標檔案裡面有一些么蛾子,它們不算是中文字元,但又佔兩個位元組,而且兩個位元組中說不定滿足有大於0xA0的。那如果是這樣的話,我們的統計就又出錯了,這就是我上面說的容易出Bug的原因。


下面我再介紹一種嚴謹的統計方法。


本文一開始說了,一個漢字佔兩個位元組,都是以1開頭的。所以我們可以考慮分別判斷對於一個字元它的兩個位元組是否都是以1作為開頭的,如果是則為中文字元。

因為1作為開頭在最高位表示“負”,所以要用unsigned char無符號型來做統計。


(現就這樣吧,等我回去補一下位運算再回來更。。)

相關文章