在 DOS 下显示汉字的方法

原创 2002年03月08日 09:00:00

由于还有很多在上大学的朋友在使用 TC 2.0,可能没有显示汉字的方法,现在提供一种方法,不过需要字库,如有需要,给我 Email:Behard@21cn.com

注意:我使用的是 BC3.1,可能 TC 的注释方式有点区别。

#include <string.h>
#include <ctype.h>
#include <bios.h>
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <graphics.h>
#include <conio.h>
#include <io.h>
#include <alloc.h>
#include <mem.h>
#include <fcntl.h>
#include <stdarg.h>
#include <math.h>

#define BOX_COLOR 13
#define FLAG_COLOR 13
#define WAVE_COLOR 5

#define LEFT_F_X 27 /* left pulse x */
#define RIGHT_F_X 255 /* right pusle x */
#define LEFT_P_X 508 /* left flow x */
#define RIGHT_P_X 736   /* right flow x */
#define PRN_MAX_X 956
#define PRN_MAX_Y 30
#define PRN_X 220
#define DX 20
#define DY 38
#define X_WID 16
#define Y_WID 16

FILE *hz16_handle;
int  getbit_16(unsigned char c,int n);
int  writec(int x,int y,int z,int color, unsigned char *p);
void writef(int x, int y, int width, int color, va_list arg_list, ...);

main()
{
 int drive=VGA;
 int mode=VGAHI;
 int i;

 hz16_handle=fopen("hzk16.dot","rb");    file://RED
 if(!hz16_handle){printf("Cant't open this file");return;}

// initgraph( &drive, &mode, "E://tc20" );
 initgraph( &drive, &mode, "E://bc31//bgi" );
 writef(100,8,44,BLACK+(LIGHTGRAY<<4),"  显示汉字,Test English,你好! ");
 writec(100,200,40,BLACK+(LIGHTGRAY<<4),"  显示汉字,Test English,你好! ");//No English
 while(!kbhit());
 closegraph();
}

void writeft(va_list arg_list, ...)
{
 int i=0;
 for(;i<32766;i++){i++;i--;}
}

void writef(int x, int y, int width, int color, va_list arg_list, ...)
{
 va_list arg_ptr;
 char *format;
 unsigned char output[81];
 unsigned char output_save,starti;
 struct textsettingstype  ts;
 int counter, len;
 unsigned char temp;
 int fc,bc,x1,y1;
 int dy,dx;
 union REGS inreg, outreg;
 if (width>78) return ;
 va_start(arg_ptr, arg_list);
 format = (char far *) arg_list;
 vsprintf((char *)output, format, arg_ptr);
 output[width]=0;
 fc=color & 0x0f;
 bc=((color & 0xf0) >>4);
 setfillstyle(1,bc);
 x1=x+width*8-1;y1=y+Y_WID;
 bar(x,y,x1,y1);
 settextstyle(0,0,1);
 dx=8;dy=4;
 counter=0;
 do {
  if((temp=output[counter])>(unsigned char) 0xa0)  /*chinese*/
  {
   starti=counter;
   counter++;
   do
   {
    temp=output[counter];counter++;
   } while (temp>(unsigned char)0xa0) ;
   output_save=output[--counter];
   output[counter]=0;
   writec(x,y,0,color,&output[starti]);
   output[counter]=output_save;
   x+=(counter-starti)*8;
  }
  else if (output[counter])   /*ascii*/
  {
   starti=counter;
   counter++;
   while(output[counter] && output[counter]<(unsigned char ) 0xa0) counter++;
   output_save=output[counter];
   output[counter]=0;
   setcolor(fc);
   outtextxy(x,y+dy,(char *) output+starti);
   output[counter]=output_save;
   x+=(counter-starti)*dx;
  }
 } while(output[counter] && counter<width);
}


int writec(int x,int y,int z,int color, unsigned char *p)
{
 int c1,c2,f=0;
 int i1,i2,i3,rec,jj;
 unsigned char i;
 int len;
 int fcolor,bcolor;
 long l;
 char by[32];
 unsigned char *q;

 fcolor=color & 0x0f;
 bcolor=((color & 0x0f0) >>4);
 len=strlen(p);
 setfillstyle(1,bcolor);
 bar(x,y,x+len*8+(len/2)*z,y+15);
 for ( ; i= *p; p++)
 {
  if(i & 0x80)
  {
   if(f==0)
   {
    c1=(char)i;
    f=1;
   }
   else
   {
    c2=(char)i;
    f=0;
    if(c1<0)
    {
     c1=c1+97;
     c2=c2+1;
     l=((c1-1)*94L+c2)*32;
/*     printf("%d,%d,,",c1,c2);*/
     fseek(hz16_handle,l,SEEK_SET);
     fread(by,32,1,hz16_handle);
    }
    for(i1=0;i1<16;i1++)
    {
     for(i2=0;i2<2;i2++)
     {
      for(i3=0;i3<8;i3++)
      {
       if(getbit_16( (unsigned char) by[i1*2+i2],7-i3))
       {
        putpixel(x+i2*8+i3-1,y+i1-1,fcolor);/*printf("1");*/
       }
      }
     }
    }
    x=x+16;
   }
  }
 }
 return(x);
}

int getbit_16(unsigned char c,int n)
{
 return((c>>n)&1);
}

在Dos对话框中如何输入汉字

在Dos对话框中也可以输入汉字。
  • zyj_123456789
  • zyj_123456789
  • 2013年10月27日 20:07
  • 1490

DOS窗口中文显示乱码

记得以前的dos是可以显示中文的,但是今天复制东西发现竟然不能显示中文了,遇见中文就成了? 在右键->默认值中的默认代码页也显示有中文GBK,但是不管用 在右键->属性中的当前代码...
  • jk110333
  • jk110333
  • 2013年09月06日 10:14
  • 1902

DOS上动态显示日期和时间

;我们这边的程序是要显示当前的COMS的时间,动态的…… DATAS SEGMENT ;此处输入数据段代码 DB 0,0,'/',0,0,'/',0,0,' ',0,0,':'...
  • qungxue
  • qungxue
  • 2011年05月24日 22:28
  • 2026

DOS命令:cd显示当前目录名或改变当前目录

DOS的CD命令:显示当前目录名或改变当前目录 cd / 进入根目录 cd.. 到上级目录 cd 显示当前目录 cd /d d:sdk 可以同时更改盘符和目录   以下是DOS的CD...
  • killerggf
  • killerggf
  • 2011年03月10日 13:55
  • 10161

MySQL - DOS下查看数据集乱码

项目中汉字显示正常,使用Navicat for MySQL也可以正常显示/插入。但是在DOS下查询显示乱码,且插入失败。【1】DOS下查询Navicat for MySQL 正常显示:注意:这里表字符...
  • J080624
  • J080624
  • 2017年06月05日 14:14
  • 368

主方法main函数输入参数在dos下的实现

1、带参数的简单除法运算代码: public class Exceptiontest { public static void main(String[] args) { // TODO A...
  • a904235765
  • a904235765
  • 2015年01月26日 09:20
  • 648

在DOS中利用Tree命令生成目录树

在DOS中利用Tree命令生成目录树
  • u013476464
  • u013476464
  • 2015年01月20日 12:36
  • 1164

DOS下显示汉字_点阵汉字显示[转]

DOS下显示汉字_点阵汉字显示    这两天在LCD上显示汉字,这篇文章给了不少帮助。概念写得很详细,算法也很好。    由于Turbo C应用于DOS操作系统下,在使用Turbo C进行程序设计时,...
  • dididu1515
  • dididu1515
  • 2010年05月03日 16:56
  • 2083

在DOS下的DEBUG命令的详细用法

名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump) 内存16进制显示 d [addre...
  • xueyang214
  • xueyang214
  • 2006年05月06日 14:50
  • 1356

MYSQL在dos下汉字乱码解决

如果在dos下数据库中创建的表格汉字乱码出现“ ?” 时 第一步 :先查看字符集编码:show variables like '%char%'; 第二步:修改字符集编码(可修改为gbk,gb231...
  • u012871180
  • u012871180
  • 2013年12月20日 19:10
  • 1961
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在 DOS 下显示汉字的方法
举报原因:
原因补充:

(最多只允许输入30个字)