当前位置:
文档之家› 快速获取汉字任意输入码的方法与实现
快速获取汉字任意输入码的方法与实现
A Fast Way for Obtaining Arbitrary Input Codes of
Chinese Characters and Its Realization
LI Quanzhong , ZHANG Fuling ( College of Sciences , Shandong Agricultural University , Tai'an271018 ) 【 Abstract】 Take UCDOS as an exemple , the paper analyzes the diverse searching mechanism of Chinese character input codes . On the basis of this mechamism , a technique of obtaining Chinese character input codes in application programs is established , and this provides a more convenient and possible way for the ereation of various operatable input code comparison tables . 【 Key words】 Chinese character ; Input method ; Input code ; UCDOS
CS:4683 8AE3 MOV AH,BL
CS:4685 86E0 XCHG AH,AL
;高低8位交换,AX即为汉字的机内码
CS:4687 E85609 CALL 4FE0 ;清除提示行准备工作
CS:468A E88208 CALL 4Fห้องสมุดไป่ตู้F ;清除提示行
CS:468D 50
PUSH AX ;保存汉字机内码
可形成一个被应用程序调用的汇编子程序。其入、出口参数
同上。
CS:46D3 0E
PUSH CS
CS:46D4 1F
POP DS
CS:46D5 FF5F0C CALL FAR [BX+0C]
CS:46D8 CB
RETF
当该子程序被调用完后,应立即将CS :46D3 —46D8 处
的指令恢复成原来的指令代码,即恢复成如下的代码。
CS:46E9 AC LODSB ;经必要的处理后显示在提示行上的 CS:46EA 0AC0 OR AL,AL ;过程
CS:46EC 7409 JZ 46F7
CS:46EE 3C20 CMP AL,20
CS:46F0 7405 JZ 46F7
CS:46F2 E87708 CALL 4F6C
CS:46F5 E2F2 LOOP 46E9
1 获取汉字输入码的途径
我们知道,任何一种汉字平台都配备了若干种汉字输入 法,以满足不同用户的要求,如UCDOS配备了近10种,而 Win95/98则配备了10多种。
能否从现有汉字平台配备的输入法中获取所需要的汉字 输入码?这应当作为考虑解决这个问题的出发点。
然而,事实上如果要从UCDOS 或Win95/98所 提 供 的 汉 字编码文件中寻找所需,无疑是不可取的,因为这些编码文 件无论是文本还是经过编译的都含有大量词组,实际操作中 面临的工作量之大、困难之多是不言而喻的。
CS:46F7 B020 MOV AL,20
CS:46F9 E87008 CALL 4F6C
CS:46FC 58
POP AX
CS:46FD 5B
POP BX
CS:46FE EBA5 JMP 46A5 ;反查下一输入法对应的输入码
不难发现,CS:46D6 CALL FAR [BX+0C]这个远程调
用完成的正是反查输入码的功能(限于篇幅,代码略)。分析
;有反查输入码程序入口 ?
CS:46BF 743B JZ 46FC
;无,检测下一切换键
CS:46C1 C537 LDS SI,[BX] ;取输入法名称地址
CS:46C3 B90800 MOV CX,0008 ;以下显示输入法名称
CS:46C6 AC
LODSB
CS:46C7 E8A208 CALL 4F6C
如何得到可操作的汉字的输入码?仅以FoxBASE应用
程序为例进行示范。其基本思想是,由FoxBASE的内存变
量提供汉字,通过调用后面设计的汇编子程序查得汉字的输
入码并将其返回到原内存变量中,从而得到了可操作的汉字
输入码。
现立足于获得汉字的全拼输入码(Alt+F2对应的输入法 )
的想法,并根据FoxBASE调用汇编语言子程序的约定,可
在有关软件开发中,往往需要一种按一定结构存放的易 于操作的汉字输入码表来配合,以实现特定的功能。如专业 词库以拼音为序的排序,药品名称以拼音首字符为检索码的 检索方法的实现,以及汉字的拼音读音标注等。这一切,对 于那些手头没有合适的汉字编码对照表的普通编程人员来 讲,很容易陷入困境。显然,如何获得汉字的某种输入码 (编码)是组织具有可操作性码表的关键,也是解决上述问题 的基础。
第 28卷 第 3期 Vol.28 № 3
计 算 机 工 程 Computer Engineering
2002年 3月 March 2002
· 开 发 研 究 与 设 计 技 术 · 文章编号: 1000— 3428(2002)03 — 0262— 03
文献标识码:A
中图分类号: TP391.12
遗憾的是,UCDOS并没有把这个功能设计成独立的功 能调用向用户开放,而是设计成系统内部调用的代码形式。
3 反查输入码机制简要分析
通过对 UCDOS6. 0的 KNL.COM与LIMD. COM程 序 本身及加载过程的分析发现, KNL通过接管、重置 8H/9H/ 10H/16H等一系列中断程序来形成UCDOS的处理核心,并为 LIMD预留了足够大的注册区(首址为CS :15F6)。对于每种 输入法,注册区为其依序对应一个注册项,即汉字输入法对 应的功能键的序号与它的注册项序号相同。每个注册项长 16 个字节:前8字节存放输入法的名称,最后4字节存放反查输 入码程序入口地址。
CS:468E E8DB08 CALL 4F6C ;在提示行显示汉字的左半部分
CS:4691 58
POP AX
CS:4692 50
PUSH AX
CS:4693 8AC4 CS:4695 E8D408
MOV AL,AH
CALL 4F6C ;在提示行显示汉字的右半部分
CS:4698 B02D MOV AL,2D CS:469A E8CF08 CALL 4F6C ;显示'-'
表明,这个远程调用的入口参数是,AX为汉字的机内码,
DS:[BX+0C]为反查输入码程序入口;出口参数是,AX、
BX、DX为返回的输入码,每8位代表一个输入码,即最大
码长为6。
4 获取汉字输入码的方法
基于以上分析,又考虑到KNL中的环境因素,只要在内
存中动态地对CS:46D3—46D8处的指令作如下的改造,就
快速获取汉字任意输入码的方法与实现
李全忠, 张福岭 (山东农业大学理学院,泰安 271000 ) 摘 要 :以UCDOS为例简要分析了该平台下的汉字输入码反查机制,给出了以此机制为基础实现在应用程序中获取汉字输入码的方法,从 而为各种可操作的输入码对照表的生成提供了方便与可能。 关 键 词 :汉字; 输入法;输入码; UCDOS
PUSH AX
CS:46B3 E87BF7 CALL 3E31 ;计算BL对应输入法名称的入口地址DS:[BX]
CS:46B6 833F00 CS:46B9 7441
CMP WORD PTR [BX],+00
;BL切换键加载了输入法?
JZ 46FC
;无,检测下一切换键
CS:46BB 837F0CFF CMP WORD PTR [BX+0C],-01
而LIMD在加载输入法时,除将被加载输入法的一些重 要数据载入内存外,还将输入法名称和反查输入码的入口地 址填入KNL为它预留的注册项中,当然若该输入法不具有输 入码反查功能的话,则注册项中用于存放反查输入码程序入 口地址的单元将保持4字节0FFH不变。
还必须说明的是,LIMD每加载一次就又重新接管、重 置16H中断程序,但它不重置08H中断程序。也就是说,当 驻留后无论后续再加载或驻留UCDOS的什么功能 模块,8H中断它都不再被接管和重置,因此,输入法的注 册项可通过新的8H中断的段地址来访问,即输入法注册项 的段地址为重置后的8H中断的段地址。
CS:46DD 8BF7 MOV SI,DI
CS:46DF AB
STOSW
CS:46E0 8BC3 MOV AX,BX
CS:46E2 AB
STOSW
CS:46E3 8BC2 MOV AX,DX
CS:46E5 AB
STOSW
CS:46E6 B90600 MOV CX,0006 ;以下是从数据区中逐一取出输入码
UCDOS的汉字输入法是可以随时加载和卸载的,其加 载是通过被称之为万能加载程序LIMD完成的。利用它可以 加载诸如全拼、简拼、五笔等多种输入法。
UCDOS的另一个特点是,可以随时通过按Ctrl+F2键来 反查屏幕光标指示的单个汉字的、由LIMD加载的、所有输 入法的输入码,并显示在提示行上。
—262—
CS:469D B03E MOV AL,3E CS:469F E8CA08 CALL 4F6C ;显示'>' CS:46A2 58 POP AX ;弹出汉字机内码,准备反查输入码
CS:46A3 B300
MOV BL,00 ;BL为由LIMD加载输入法时指定的