VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 726|回复: 2

C语言怎样显示GBK汉字啊?

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-14 15:40:01 | 显示全部楼层 |阅读模式
网上能找到gb2312的,(如下)

但是gbk编码的字库就不行了,

用offset=((ch1-0x81)*190+(ch2-0x40)-(ch2/128))*32L算出来的偏移还是不对啊

应该怎么处理啊?

----TC显示gb2312汉字-------
#include <graphics.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <stdlib.h>
#include <conio.h>
#define ROW 1/*纵坐标放大倍数*/
#define COL 1/*横坐标放大倍数*/

void main()
{
        int x,y;
        char *s="汉字显示程序";
        FILE *fp;
        char buffer[32];        /*buffer用来存储一个汉字*/
        register m,n,i,j,k;
        unsigned char qh,wh;
        unsigned long offset;
        int gd=DETECT,gm;        /*图形屏幕初始化*/
        initgraph(&gd,&gm," ");
        if ((fp=fopen("GBK16","rb"))==NULL)                /*打开汉字库,该字库可以在ucdos中找到*/
        {
                printf("Can't open haz16,Please add it");
                getch(); closegraph(); exit(0);
        }
       
        x=20; y=100;        /*显示位置设置*/

        while(*s)
        {
                qh=*(s)-0xa0;/*汉字区位码*/
                wh=*(s+1)-0xa0;
                offset=(94*(qh-1)+(wh-1))*32L;/*计算该汉字在字库中偏移量*/
                
                fseek(fp,offset,SEEK_SET);
                fread(buffer,32,1,fp); /*取出汉字32字节的点阵字模存入buffer中(一个汉字)*/
               
                for(i=0;i<16;i++)/*将32位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字*/
                        for(n=0;n<ROW;n++)
                                for(j=0;j<2;j++)
                                        for(k=0;k<8;k++)
                                                for(m=0;m<COL;m++)
                                                        if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
                                                                putpixel(x+8*j*COL+k*COL+m,y+i*ROW+n,GREEN);
                s+=2; /*因为一个汉字内码占用两个字节,所以s必须加2*/
                x+=30;
        }getch();

        closegraph();
}
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-9 15:15:01 | 显示全部楼层
GBK不再象GB2312那样由区位码计算,而直接给出:高字节0x81~0xFE,低字节0x40~0xFE,直接依次放置应该就可以了.注意大小端问题.
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-8-9 14:30:01 | 显示全部楼层
谢谢ls
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表