自制漢字取模軟件,學嵌入式的要看(王挺帥)建議無協(xié)成員看
漢字點陣取模 16*16點陣 轉(zhuǎn)載請注明出處
學嵌入式開發(fā)這么長時間來一直都在使用別人的取模軟件,很希望有自己的取模軟件。
今天晚上讀了一下漢字編碼和點陣的文章做程序如下。希望對無協(xié)嵌入式開發(fā)有幫助
在計算機中英文一般使用 ASCII 碼來表示,而漢字編碼使用的是擴展 ASCII 碼,用兩個ASCII碼來表示一個漢字。一個ASCII碼占用一個字節(jié),所有在存儲時英文是占用一個字節(jié),而漢字占用兩個字節(jié)。
擴展 ASCII 碼:也就是 ASCII 碼的最高位是1的 ASCII 碼,一個漢字由兩個擴展 ASCII 碼組成,第一個擴展 ASCII 碼用來存放區(qū)碼,第二個擴展 ASCII 碼用來存放位碼。
區(qū)位碼:在 GB2312-80 標準中,將所有的漢字分為94個區(qū),每個區(qū)有94個位可以存放94個漢字,形成了人們常說的區(qū)位碼,這樣總共就有 94*94=8836 個漢字。
點陣字庫:漢字點陣數(shù)據(jù)就是按照這個區(qū)位的順序來存放的,也就是最先存放的是第一個區(qū)的漢字點陣數(shù)據(jù),在每一個區(qū)中有是按照位的順序
來存放的。
漢字機內(nèi)碼、國標碼和區(qū)位碼三者之間的關(guān)系為:區(qū)位碼(十進制)的兩個字節(jié)分別轉(zhuǎn)換為十六進制后加20H得到對應(yīng)的國標碼;機內(nèi)碼是漢字交換碼(國標碼)兩個字節(jié)的最高位分別加1,即漢字交換碼(國標碼)的兩個字節(jié)分別加80H得到對應(yīng)的機內(nèi)碼;區(qū)位碼(十進制)的兩個字節(jié)分別轉(zhuǎn)換為十六進制后加A0H得到對應(yīng)的機內(nèi)碼
國標碼 由兩個擴展ascii碼組成
漢字區(qū)位碼的存放實在擴展 ASCII 基礎(chǔ)上存放的,并且將區(qū)碼和位碼都加上了32,然后存放在兩個擴展 ASCII 碼中。具體的說就是:
漢字的
第一個擴展ASCII碼 = 128+32 + 漢字區(qū)碼
第二個擴展ASCII嗎 = 128+32 + 漢字位碼
第二個擴展ASCII嗎 = 128+32 + 漢字位碼
程序要用的字庫HZK16
程序如下
#include "stdio.h" #include<iostream> using namespace std; void getCode(unsigned char str[],unsigned char data[]); void main() { unsigned char str[] = {"王挺帥"}; unsigned char data[32]; for(int m = 0;m <1;m++){ getCode(str+m*2,data); for (int j=0 ;j<32;j+=2) { // char 轉(zhuǎn)換成二進制輸出 for(int t = 7;t>=0;t--) { if((data[j]>>t)&1) printf("%d ",(data[j]>>t)&1); else printf(" ",(data[j]>>t)&1); } for(int t = 7;t>=0;t--) { if((data[j+1]>>t)&1) printf("%d ",(data[j+1]>>t)&1); else printf(" ",(data[j+1]>>t)&1); } cout<<endl; } } getchar(); } //返回點陣數(shù)組 void getCode(unsigned char str[],unsigned char data[]){ char font_file_name[] = "HZK16"; // 點陣字庫文件名 int font_width = 16; // 單字寬度 int font_height = 16; // 單字高度 int start_offset = 0; // 偏移 long offset; FILE *fp; fp = fopen(font_file_name, "rb"); int offset_size = font_width * font_height / 8; int string_size = font_width * font_height; int i=0; if (str[i] > 160) { // 先求區(qū)位碼,然后再計算其在區(qū)位碼二維表中的位置,進而得出此字符在文件中的偏移 offset = ((str[i] - 0xa1) * 94 + str[i+1] - 0xa1) * offset_size; i++; } else { offset = (str[i] + 156 - 1) * offset_size; } // 讀取其點陣數(shù)據(jù) fseek(fp, start_offset + offset, SEEK_SET); fread(data,sizeof(char), offset_size,fp); fclose(fp); }