首先,先介紹GB2312-80編碼。參看文章“GB2312編碼”。以下內容來自那篇文章。
GB2312或GB2312-80是一個簡體中文字符集的中國國家標准,全稱為《信息交換用漢字編碼字符集--基本集》,由中國國家標准總局發布,1981年5月1日實施。GB2312編碼通行於大陸;新加坡等地也采用此編碼。幾乎所有的中文系統和國際化的軟件都支持GB2312。
GB2312標准共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個;同時,GB2312收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄羅斯語西裡爾字母在內的682個全形字符。
GB2312的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆蓋99.75%的使用頻率。
對於人名、古漢語等方面出現的罕用字,GB2312不能處理,這導致了後來GBK及GB18030漢字字符集的出現。
分區表示
GB2312中對所收漢字進行了“分區”處理,每區含有94個漢字/符號。這種表示方式也稱為區位碼。
01-09區為特殊符號。
16-55區為一級漢字,按拼音排序。
56-87區為二級漢字,按部首/筆畫排序。
10-15區及88-94區則未有編碼。
舉例來說,“啊”字是GB2312之中的第一個漢字,它的區位碼就是1601。
字節結構
在使用GB2312的程序中,通常采用EUC儲存方法,以便兼容於ASCII。
每個漢字及符號以兩個字節來表示。第一個字節稱為“高位字節”,第二個字節稱為“低位字節”。“高位字節”使用了0xA1-0xF7(把01-87區的區號加上0xA0),“低位字節”使用了0xA1-0xFE(把01-94加上0xA0)。例如“啊”字在大多數程序中,會以0xB0A1儲存。(與區位碼對比:0xB0=0xA0+16,0xA1=0xA0+1)。
在實際的運用中,有時會要求判斷一個中文字符是否是GB2312中的中文字符。
在VB2005中,tB = System.Text.Encoding.GetEncoding("gb18030").GetBytes(S),表示將字符S的內碼放到tB這個字節數組裡。其中gb18030是向下兼容gb2312。
於是,編寫了一個函數,用來判斷字符是否是gb2312的中文字符。用的是VB2005。代碼格式修正於2012年1月6日。
Public Function IsGB2312(ByVal S As String) As Boolean
If S Is Nothing Then Return False
If S = "" Then Return False
If S.Length > 1 Then S = S.Substring(0, 1)
Dim tB() As Byte
Try
tB = System.Text.Encoding.GetEncoding("gb18030").GetBytes(S)
If tB.Length = 2 Then
If tB(0) >= 176 AndAlso tB(0) <= 247 AndAlso tB(1) >= 161 AndAlso tB(1) <= 254 Then
If tB(0) = 215 AndAlso tB(1) > 249 Then
Return False
Else
Return True
End If
Else
Return False
End If
Else
Return False
End If
Catch
Return False
End Try
End Function
注:在VB2005中,ASC函數也能返回字符的內碼,不過返回值是Integer型的。而且由於和早期的VB版本兼容,返回值還進行了一定的處理。早期的VB中Integer用的是2個字節,那麼,漢字的內碼也是兩個字節,這兩個字節組成一個Integer型的變量,由於第一個字節的最高位一定是1,所以,早期的VB的漢字的內碼是一個小於0的整數。而VB2005的Integer型的變量是4個字節。漢字的內碼是兩個字節,轉到Integer型,填充到後面兩個字節,前面兩個字節用0填充,這樣一來,VB2005的漢字內碼應該是一個正數,但為了和早期的兼容,VB2005做了一定的處理,用了一個公式256X+Y-65536來計算漢字的內碼,其中X是內碼的第一個字節,Y是內碼的第二個字節。