1、漢字機內碼
以漢字“啊”為例,它的的機內碼為0xB0A1,0xB0為機內碼高字節,0xA1為機內碼低字節
2、GB2312
GB2312收錄簡化漢字及符號、字母、日文假名等共7445個圖形字符,其中漢字占6763個。GB2312規定“對任意一個圖形字符都采用兩個字節表示,每個字節均采用七位編碼表示”,習慣上稱第一個字節為“高字節”,即所謂的區碼。第二個字節為“低字節”,即所謂的位碼。GB2312―80包含了大部分常用的一、二級漢字,和9區的符號。該字符集是幾乎所有的中文系統和國際化的軟件都支持的中文字符集,這也是最基本的中文字符集。其編碼范圍是高位0xa1~0xfe,低位也是0xa1~0xfe;漢字從0xb0a1開始,結束於0xf7fe。GB2312將代碼表分為94個區,對應第一字節(0xa1~0xfe);每個區94個位(0xa1~0xfe),對應第二字節。兩個字節的值分別為區號值和位號值加32(20H),因此也稱為區位碼。01~09區為符號、數字區,16~87區為漢字區(0xb0~0xf7),10~15區、88~94區是有待進一步標准化的空白區。GB2312將收錄的漢字分成兩級:第一級是常用漢字計3755個,置於16~55區,按漢語拼音字母/筆形順序排列:第二級漢字是次常用漢字計3008個,置於56~87區,按部首/筆畫順序排列。故而GB2312 最多能表示6763 個漢字。點陣庫只要按照這個編碼規則從0XA1A1開始,逐一建立,每個區的點陣大小為每個漢字所用的字節數乘以94。這樣,就可以得到在這個字庫里面定位漢字的方法:
Hp=((GBH-0xA1)×94+GBL-0XA1)×(size);
其中GBH、GBL 分別代表GB2312 的第一個字節和第二個字節(也就是高位和低位),size 代表每個漢字點陣所需的字節數,Hp 則為對應漢字點陣數據在字庫里面的起始地址。
3、GBK
而GBK內碼完全兼容GB2312,同時支持繁體字,總漢字數有2萬多個,編碼格式如下,每個GBK碼由2個字節組成,第一個字節為0X81~0XFE,第二個字節分為兩部分,一是0X40~0X7E,二是0X80~0XFE。其中與GB2312相同的區域,字完全相同。把第一個字節代表的意義稱為區,那么GBK里面總共有126個區(0XFE~0X81+1),每個區內有190個漢字(0XFE~0X80+0X7E~0X40+2),總共就有126x190=23940個漢字。點陣庫只要按照這個編碼規則從0X8140開始,逐一建立,每個區的點陣大小為每個漢字所用的字節數乘以190。這樣,就可以得到在這個字庫里面定位漢字的方法:
當GBKL<0X7F 時:Hp=((GBKH-0x81)×190+GBKL-0X40)×(size);
當GBKL>0X80 時:Hp=((GBKH-0x81)×190+GBKL-0X41)×(size);
其中GBKH、GBKLL 分別代表GBK 的第一個字節和第二個字節(也就是高位和低位),size 代表每個漢字點陣所需的字節數,Hp 則為對應漢字點陣數據在字庫里面的起始地址。
4、點陣偏移量計算驗證
4.1 以16*16點陣為例,生成16*16的GB2312和GBK點陣字庫
4.2 打開GB2312_16x16CPP和GBK_16x16CPP兩個文件,在兩個文件內搜索定位到“啊”的點陣,確認“啊”的點陣值(這一步的點陣數據比較沒有什么意義,主要是謹慎起見,確保點陣值無誤)
4.3 根據“啊”的機內碼(0xB0A1)分別計算在GB2312 16x16點陣字庫和GBK 16x16點陣字庫內的偏移量
16x16點陣每個漢字所需的字節數為32
GB2312:Hp=((GBH-0xA1)×94+GBL-0XA1)×(size); Hp=((0xB0-0xA1)×94+0xA1-0XA1)×(32)=45120(0xB040)
GBK:Hp=((GBKH-0x81)×190+GBKL-0X41)×(size); Hp=((0xB0-0x81)×190+0xA1-0X41)×(32)=288832(0x46840)
4.4 打開GB2312_16x16BIN,定位到0xB040地址;打開GBK_16x16BIN,定位到0x46840地址
可以看到,兩個文件定位到的點陣數據一模一樣,並且與CPP文件內的點陣數據也一樣。至此,偏移量計算驗證完畢。
接下來,你就可以把bin文件找個地方存放起來,然后根據機內碼計算偏移量隨意調用了