c语言识别文件中的汉字,读取汉字库中的汉字

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕上,本文是读 UCDOS 16点字库文件的示例。

在 UCDOS 的点阵字库 HZK16 中,字符点阵是按照汉字内码排列的,汉字的内码从一些图形字符开始,起始编码为 A1A1H,汉字内码第一位为区码,每区为 94 个汉字,第二位为每区内的编码,每个汉字的点阵为 16点*16点 共32字节,数据按第一行 1-8点,9-16点,第二行 1-8点,9-16点...排列,每位数据 1 为要显示点,0 为不显示点。汉字点阵数据在字库中的偏移量为 ((区码-A1H)*94 + (区内编码-A1H))*32。

本程序为一个简单的例子,要显示的汉字在变量 DISP_DATA 中,且没有考虑汉字、英文混用的情况。

源程序:

; Write in May 22,1996

;            By LuoYunBin ----- http://asm.yeah.net

.286

LINE_CHAREQU210;在屏幕上第几行显示

COL_CHAREQU230;在屏幕上第几列显示

COLOR_CHAREQU0EH;显示颜色

CHARSEQU(offset disp_data_end-offset disp_data)/2

CODESEGMENT

ASSUME CS:CODE,DS:CODE

ORG 100H

START:

jmpinstall

CC_FILEDB'C:\UCDOS\HZK16',0;字库文件名,用 UCDOS 的16点阵汉字库

HANDLEDW?;file handle

DISP_DATADB'罗云彬';要显示的汉字

DISP_DATA_ENDEQUTHIS BYTE

D_OPEN_ERRORDB'File C:\UCDOS\HZK16 not found !',0dh,0ah,24h

install:

movax,3d00h;打开汉字库

movdx,offset cc_file

int21h

jnbopen_ok

movah,9

movdx,offset d_open_error

int21h

int20h

open_ok:

movhandle,ax

movsi,offset disp_data

movdi,offset zi_buffer

movcx,chars

cld

ins2:

lodsb

movah,al

lodsb

callget_dots;读出汉字点针

loopins2

calldisp_cc;显示到屏幕

int20h

GET_DOTSPROC

pusha

subax,0a1a1h;汉字的内码从 A1区开始

cwd

movdl,al;所以绝对开始区是内码-A1

moval,ah;点阵在字库中的位置为

cbw

movbl,94;((汉字码1-A1)* 94 + 汉字码2 - A1)* 32

mulbl

addax,dx

movbx,32

mulbx

movcx,dx

movdx,ax

movax,4200h;移动读写指针到点阵数据位置

movbx,handle

int21h

movah,3fh

movcx,32

movdx,di

int21h

popa

adddi,32

ret

GET_DOTSENDP

DISP_CCPROC

movax,12h;640*480 mode

int10h;设置640*480/16色显示模式

movcx,chars

movsi,offset zi_buffer

movbx,col_char-20;BX = column

dh_lop0:

addbx,20;every char column+20

pushcx

movcx,16;l6 lines/char

movdx,line_char;DX = start line

dh_lop1:

pushbx

pushcx

lodsb;16 dots/line

movah,al

lodsb

movcx,16

dh_lop2:

shlax,1

pushax

pushbx

pushcx

jcdb_color

xoral,al;back color is 0

jmpshort db_draw

db_color:

moval,color_char

db_draw:

movah,0ch

movcx,bx

xorbh,bh

int10h

popcx

popbx

popax

incbx;inc column

loopdh_lop2

incdx;next line

popcx

popbx

loopdh_lop1

popcx

loopdh_lop0

xorah,ah

int16h

movax,3

int10h

ret

DISP_CCENDP

ZI_BUFFEREQUTHIS BYTE

CODEENDS

END START

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值