<address id="tnvjh"></address>
    <form id="tnvjh"><listing id="tnvjh"><meter id="tnvjh"></meter></listing></form>

      <form id="tnvjh"></form>

      <address id="tnvjh"><th id="tnvjh"></th></address>

        專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        自制漢字取模軟件,學嵌入式的要看

        作者:佚名   來源:本站原創   點擊數:  更新時間:2012年01月18日   【字體:

         

        自制漢字取模軟件,學嵌入式的要看(王挺帥)建議無協成員看
        漢字點陣取模  16*16點陣  轉載請注明出處
        學嵌入式開發這么長時間來一直都在使用別人的取模軟件,很希望有自己的取模軟件。
        今天晚上讀了一下漢字編碼和點陣的文章做程序如下。希望對無協嵌入式開發有幫助
                 在計算機中英文一般使用 ASCII 碼來表示,而漢字編碼使用的是擴展 ASCII 碼,用兩個ASCII碼來表示一個漢字。一個ASCII碼占用一個字節,所有在存儲時英文是占用一個字節,而漢字占用兩個字節。
             擴展 ASCII 碼:也就是 ASCII 碼的最高位是1的 ASCII 碼,一個漢字由兩個擴展 ASCII 碼組成,第一個擴展 ASCII 碼用來存放區碼,第二個擴展 ASCII 碼用來存放位碼。
             區位碼:在 GB2312-80 標準中,將所有的漢字分為94個區,每個區有94個位可以存放94個漢字,形成了人們常說的區位碼,這樣總共就有 94*94=8836 個漢字。
             點陣字庫:漢字點陣數據就是按照這個區位的順序來存放的,也就是最先存放的是第一個區的漢字點陣數據,在每一個區中有是按照位的順序
        來存放的。
        漢字機內碼、國標碼和區位碼三者之間的關系為:區位碼(十進制)的兩個字節分別轉換為十六進制后加20H得到對應的國標碼;機內碼是漢字交換碼(國標碼)兩個字節的最高位分別加1,即漢字交換碼(國標碼)的兩個字節分別加80H得到對應的機內碼;區位碼(十進制)的兩個字節分別轉換為十六進制后加A0H得到對應的機內碼
        國標碼 由兩個擴展ascii碼組成
        漢字區位碼的存放實在擴展 ASCII 基礎上存放的,并且將區碼和位碼都加上了32,然后存放在兩個擴展 ASCII 碼中。具體的說就是:
        漢字的   
            第一個擴展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 轉換成二進制輸出
           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();
        }
        
        //返回點陣數組
         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)
         {
          // 先求區位碼,然后再計算其在區位碼二維表中的位置,進而得出此字符在文件中的偏移
          offset = ((str[i] - 0xa1) * 94 + str[i+1] - 0xa1) * offset_size;
          i++;
         }
         else
         {
          offset = (str[i] + 156 - 1) * offset_size;       
         }
         // 讀取其點陣數據
         fseek(fp, start_offset + offset, SEEK_SET);
         fread(data,sizeof(char), offset_size,fp);
         fclose(fp);
         }
        關閉窗口

        相關文章

        和老头做爰很舒服,JK白丝裤袜开裆自慰喷水,在线天堂www在线...中文

          <address id="tnvjh"></address>
          <form id="tnvjh"><listing id="tnvjh"><meter id="tnvjh"></meter></listing></form>

            <form id="tnvjh"></form>

            <address id="tnvjh"><th id="tnvjh"></th></address>