zoukankan      html  css  js  c++  java
  • UCDOS点阵字库提取

    1 /*
    2 * 参考: http://zh.wikipedia.org/wiki/GB_2312
    3 * http://zh.wikipedia.org/wiki/EUC
    4 * http://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F
    5 * x86处理器为Little endian
    6 * EUC全名为Extended Unix Code, 是一个使用8位编码来表示字符的方法.
    7 * 它使用了一些兼容于ISO/IEC 2022区位码的94x94编码表, 把每个区位加上0xA0来表示, 以便兼容于ASCII.
    8 * 它主要用于表示及储存汉语文字, 日语文字及朝鲜文字.
    9 * EUC-CN是GB 2312最常用的表示方法. 浏览器编码表上的"GB2312", 通常都是指"EUC-CN"表示法.
    10 * GB 2312中对所收汉字进行了"分区"处理, 每区含有94个汉字/符号. 这种表示方式也称为区位码.
    11 * 01-09区为特殊符号
    12 * 16-55区为一级汉字, 按拼音排序.
    13 * 56-87区为二级汉字, 按部首/笔画排序.
    14 * 10-15区及88-94区则未有编码.
    15 * 在使用GB2312的程序通常采用EUC储存方法, 以便兼容于ASCII. 浏览器编码表上的"GB2312", 通常都是指"EUC-CN"表示法.
    16 * 每个汉字及符号以两个字节来表示, 第一个字节称为"高位字节", 第二个字节称为"低位字节".
    17 * "高位字节"使用了0xA1-0xF7(把01-87区的区号加上0xA0), "低位字节"使用了0xA1-0xFE(把01-94加上0xA0).
    18 * "高位字节"表示区号每一个区记录94个汉字, "低位字节"表示位号为该字在该区中的位置.
    19 * 由于一级汉字从16区起始, 汉字区的"高位字节"的范围是0xB0-0xF7, "低位字节"的范围是0xA1-0xFE, 占用的码位是72*94=6768.
    20 * 其中有5个空位是D7FA-D7FE。
    21 * 例如"啊"字在大多数程序中, 会以两个字节, 0xB0(第一个字节)0xA1(第二个字节)储存. (与区位码对比: 0xB0=0xA0+16, 0xA1=0xA0+1).
    22 */
    23
    24 #include <stdio.h>
    25 #include <stdlib.h>
    26
    27  int main(int argc, char *argv[])
    28 {
    29 unsigned char hz[3];
    30 unsigned char hzk[16][2];
    31 int i,j;
    32 FILE *fp;
    33 if ((fp = fopen("HZK16", "r")) == NULL) {
    34 printf("Can't open ASC12!\n");
    35 } else {
    36 printf("请输入一个汉字:");
    37 scanf("%s", hz);
    38 printf("0x%02x,0x%02x\n", hz[0], hz[1]);
    39 /*
    40 * 减0xa0是因为EUC表示法中对数据进行了加上0xa0的处理,
    41 * 减1是因为数组是以0为开始而区号位号是以1为开始的,
    42 * 乘32是因为16*16点阵每个汉字占用16*16bit=16*2byte空间.
    43 */
    44 fseek(fp, (94 * ((hz[0] - 0xa0) - 1) + ((hz[1] - 0xa0) - 1)) * 32, SEEK_SET);
    45 fread(hzk,32,1,fp);
    46 for (i = 0; i < 16; i++) {
    47 for (j = 0; j < 2; j++) {
    48 printf("0x%02x\t", hzk[i][j]);
    49 }
    50 for (j = 0; j < 2; j++) {
    51 printf("%c%c%c%c%c%c%c%c", ((hzk[i][j] >> 7) & 0x01) + ' ',
    52 ((hzk[i][j] >> 6) & 0x01) + ' ',
    53 ((hzk[i][j] >> 5) & 0x01) + ' ',
    54 ((hzk[i][j] >> 4) & 0x01) + ' ',
    55 ((hzk[i][j] >> 3) & 0x01) + ' ',
    56 ((hzk[i][j] >> 2) & 0x01) + ' ',
    57 ((hzk[i][j] >> 1) & 0x01) + ' ',
    58 ((hzk[i][j] >> 0) & 0x01) + ' ');
    59 }
    60 putchar('\n');
    61 }
    62 fclose(fp);
    63 }
    64 system("PAUSE");
    65 return 0;
    66 }

    程序下载:https://files.cnblogs.com/arci/HZK16.rar

  • 相关阅读:
    C语言 sprintf 函数 C语言零基础入门教程
    C语言 printf 函数 C语言零基础入门教程
    C语言 文件读写 fgets 函数 C语言零基础入门教程
    C语言 文件读写 fputs 函数 C语言零基础入门教程
    C语言 fprintf 函数 C语言零基础入门教程
    C语言 文件读写 fgetc 函数 C语言零基础入门教程
    C语言 文件读写 fputc 函数 C语言零基础入门教程
    C语言 strlen 函数 C语言零基础入门教程
    Brad Abrams关于Naming Conventions的演讲中涉及到的生词集解
    适配器模式
  • 原文地址:https://www.cnblogs.com/arci/p/1977708.html
Copyright © 2011-2022 走看看