快速获取汉字任意输入码的方法与实现
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
CS:4683 8AE3 MOV AH,BL
CS:4685 86E0 XCHG AH,AL
;高低8位交换,AX即为汉字的机内码
CS:4687 E85609 CALL 4FE0 ;清除提示行准备工作
CS:468A E88208 CALL 4F0F ;清除提示行
CS:468D 50
PUSH AX ;保存汉字机内码
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 ;显示'-'
CS:46D3 58
POP AX
CS:46D4 50
PUSH AX
CS:46D5 FF5F0C CALL FAR [BX+0C]
CS:46D8 0E
PUSH CS
这样,就确保了系统的完整,保证了后继人工干预下的
(Ctrl+F2)反查输入码功能的正常进行。
5 在 FoxBASE应用程序中获取汉字的输入码
收 稿 日 期 :2001-06-16
查输入码程序入口?若有,则反查并显示汉字的输入码。为
了便于明确与分析起见,现将KNL中有关代码摘抄如下:
CS:467F AD
LODSW
;取汉字的左机内码送到AL
CS:4680 8AD8 CS:4682 AD
MOV BL,AL
LODSW
;取汉字的右机内码送到AL
遗憾的是,UCDOS并没有把这个功能设计成独立的功 能调用向用户开放,而是设计成系统内部调用的代码形式。
3 反查输入码机制简要分析
通过对 UCDOS6. 0的 KNL.COM与LIMD. COM程 序 本身及加载过程的分析发现, KNL通过接管、重置 8H/9H/ 10H/16H等一系列中断程序来形成UCDOS的处理核心,并为 LIMD预留了足够大的注册区(首址为CS :15F6)。对于每种 输入法,注册区为其依序对应一个注册项,即汉字输入法对 应的功能键的序号与它的注册项序号相同。每个注册项长 16 个字节:前8字节存放输入法的名称,最后4字节存放反查输 入码程序入口地址。
可形成一个被应用程序调用的汇编子程序。其入、出口参数
同上。
CS:46D3 0E
PUSH CS
CS:46D4 1F
POP DS
CS:46D5 FF5F0C CALL FAR [BX+0C]
CS:46D8 CB
RETF
当该子程序被调用完后,应立即将CS :46D3 —46D8 处
的指令恢复成原来的指令代码,即恢复成如下的代码。
PUSH AX
CS:46D5 FF5F0C
CALL FAR [BX+0C] ;反查BL对应输入法汉字AX的输入码
CS:46D8 0E
PUSH CS ;注:反查结果返回到AX、BX、DX中
CS:46D9 1F
POP DS
CS:46DA BF2247 MOV DI,4722 ;将反查结果转存到系统数据区
UCDOS的汉字输入法是可以随时加载和卸载的,其加 载是通过被称之为万能加载程序LIMD完成的。利用它可以 加载诸如全拼、简拼、五笔等多种输入法。
UCDOS的另一个特点是,可以随时通过按Ctrl+F2键来 反查屏幕光标指示的单个汉字的、由LIMD加载的、所有输 入法的输入码,并显示在提示行上。
—262—
UCDOS反查汉字输入码的基本过程是,当用户按下 Ctrl +F2键时,UCDOS首先获取光标上面汉字的机内码,然后 检查输入法注册区中的注册项情况,即对注册项按序号逐一 进行这样的操作:该注册项有无输入法名称?若有,有无反
作 者 简 介 :李全忠(1961~),男,副教授,主要从事系统分析与网 络数据库开发工作;张福岭,副教授、计算中心主任
CS:46CA E2FA LOOP 46C6
CS:46CC 0E
PUSH CS
CS:46CD 1F
POP DS
CS:46CE B03A MOV AL,3A
CS:46D0 E89908 CALL 4F6C ;在输入法名称后显示':'
CS:46D3 58
POP AX ;弹出汉字的机内码
CS:46D4 50
在有关软件开发中,往往需要一种按一定结构存放的易 于操作的汉字输入码表来配合,以实现特定的功能。如专业 词库以拼音为序的排序,药品名称以拼音首字符为检索码的 检索方法的实现,以及汉字的拼音读音标注等。这一切,对 于那些手头没有合适的汉字编码对照表的普通编程人员来 讲,很容易陷入困境。显然,如何获得汉字的某种输入码 (编码)是组织具有可操作性码表的关键,也是解决上述问题 的基础。
如何得到可操作的汉字的输入码?仅以FoxBASE应用
程序为例进行示范。其基本思想是,由FoxBASE的内存变
量提供汉字,通过调用后面设计的汇编子程序查得汉字的输
入码并将其返回到原内存变量中,从而得到了可操作的汉字
输入码。
现立足于获得汉字的全拼输入码(Alt+F2对应的输入法 )
的想法,并根据FoxBASE调用汇编语言子程序的约定,可
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 ;以下是从数据区中逐一取出输入码பைடு நூலகம்
;有反查输入码程序入口 ?
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
CS:469D B03E MOV AL,3E CS:469F E8CA08 CALL 4F6C ;显示'>' CS:46A2 58 POP AX ;弹出汉字机内码,准备反查输入码
CS:46A3 B300
MOV BL,00 ;BL为由LIMD加载输入法时指定的
CS:46A5 FEC3 INC BL ;切换键序号,如Alt+F2对应的BL=2
而LIMD在加载输入法时,除将被加载输入法的一些重 要数据载入内存外,还将输入法名称和反查输入码的入口地 址填入KNL为它预留的注册项中,当然若该输入法不具有输 入码反查功能的话,则注册项中用于存放反查输入码程序入 口地址的单元将保持4字节0FFH不变。
还必须说明的是,LIMD每加载一次就又重新接管、重 置16H中断程序,但它不重置08H中断程序。也就是说,当 KNL.COM驻留后无论后续再加载或驻留UCDOS的什么功能 模块,8H中断它都不再被接管和重置,因此,输入法的注 册项可通过新的8H中断的段地址来访问,即输入法注册项 的段地址为KNL.COM重置后的8H中断的段地址。
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]这个远程调
用完成的正是反查输入码的功能(限于篇幅,代码略)。分析
表明,这个远程调用的入口参数是,AX为汉字的机内码,
DS:[BX+0C]为反查输入码程序入口;出口参数是,AX、
BX、DX为返回的输入码,每8位代表一个输入码,即最大
码长为6。
4 获取汉字输入码的方法
基于以上分析,又考虑到KNL中的环境因素,只要在内
存中动态地对CS:46D3—46D8处的指令作如下的改造,就
但幸运的是,这两种汉字平台下的汉字输入法都具有反 查单个汉字输入码的功能,这个特点为有效获取汉字的输入 码提供了保证。即可以不通过与汉字编码文件交涉而是通过 利用它们反查汉字输入码的机制求得问题的妥善解决。
下面以UCDOS6.0为例来讨论获取汉字输入码的方法 与实现过程。
2 UCDOS6. 0汉字输入法的加载与特点
快速获取汉字任意输入码的方法与实现
李全忠, 张福岭 (山东农业大学理学院,泰安 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
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:46A7 80FB06 CMP BL,06 ;Alt+F6为英文方式切换,跳 过
CS:46AA 74F9 JZ 46A5
CS:46AC 80FB0A CMP BL,0A ;功能切换键序号大于10?
CS:46AF 774F JA 4700
;是,全部查完,结束
CS:46B1 53
PUSH BX
CS:46B2 50
第 28卷 第 3期 Vol.28 № 3
计 算 机 工 程 Computer Engineering
2002年 3月 March 2002
· 开 发 研 究 与 设 计 技 术 · 文章编号: 1000— 3428(2002)03 — 0262— 03
文献标识码:A
中图分类号: TP391.12
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
CS:4683 8AE3 MOV AH,BL
CS:4685 86E0 XCHG AH,AL
;高低8位交换,AX即为汉字的机内码
CS:4687 E85609 CALL 4FE0 ;清除提示行准备工作
CS:468A E88208 CALL 4F0F ;清除提示行
CS:468D 50
PUSH AX ;保存汉字机内码
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 ;显示'-'
CS:46D3 58
POP AX
CS:46D4 50
PUSH AX
CS:46D5 FF5F0C CALL FAR [BX+0C]
CS:46D8 0E
PUSH CS
这样,就确保了系统的完整,保证了后继人工干预下的
(Ctrl+F2)反查输入码功能的正常进行。
5 在 FoxBASE应用程序中获取汉字的输入码
收 稿 日 期 :2001-06-16
查输入码程序入口?若有,则反查并显示汉字的输入码。为
了便于明确与分析起见,现将KNL中有关代码摘抄如下:
CS:467F AD
LODSW
;取汉字的左机内码送到AL
CS:4680 8AD8 CS:4682 AD
MOV BL,AL
LODSW
;取汉字的右机内码送到AL
遗憾的是,UCDOS并没有把这个功能设计成独立的功 能调用向用户开放,而是设计成系统内部调用的代码形式。
3 反查输入码机制简要分析
通过对 UCDOS6. 0的 KNL.COM与LIMD. COM程 序 本身及加载过程的分析发现, KNL通过接管、重置 8H/9H/ 10H/16H等一系列中断程序来形成UCDOS的处理核心,并为 LIMD预留了足够大的注册区(首址为CS :15F6)。对于每种 输入法,注册区为其依序对应一个注册项,即汉字输入法对 应的功能键的序号与它的注册项序号相同。每个注册项长 16 个字节:前8字节存放输入法的名称,最后4字节存放反查输 入码程序入口地址。
可形成一个被应用程序调用的汇编子程序。其入、出口参数
同上。
CS:46D3 0E
PUSH CS
CS:46D4 1F
POP DS
CS:46D5 FF5F0C CALL FAR [BX+0C]
CS:46D8 CB
RETF
当该子程序被调用完后,应立即将CS :46D3 —46D8 处
的指令恢复成原来的指令代码,即恢复成如下的代码。
PUSH AX
CS:46D5 FF5F0C
CALL FAR [BX+0C] ;反查BL对应输入法汉字AX的输入码
CS:46D8 0E
PUSH CS ;注:反查结果返回到AX、BX、DX中
CS:46D9 1F
POP DS
CS:46DA BF2247 MOV DI,4722 ;将反查结果转存到系统数据区
UCDOS的汉字输入法是可以随时加载和卸载的,其加 载是通过被称之为万能加载程序LIMD完成的。利用它可以 加载诸如全拼、简拼、五笔等多种输入法。
UCDOS的另一个特点是,可以随时通过按Ctrl+F2键来 反查屏幕光标指示的单个汉字的、由LIMD加载的、所有输 入法的输入码,并显示在提示行上。
—262—
UCDOS反查汉字输入码的基本过程是,当用户按下 Ctrl +F2键时,UCDOS首先获取光标上面汉字的机内码,然后 检查输入法注册区中的注册项情况,即对注册项按序号逐一 进行这样的操作:该注册项有无输入法名称?若有,有无反
作 者 简 介 :李全忠(1961~),男,副教授,主要从事系统分析与网 络数据库开发工作;张福岭,副教授、计算中心主任
CS:46CA E2FA LOOP 46C6
CS:46CC 0E
PUSH CS
CS:46CD 1F
POP DS
CS:46CE B03A MOV AL,3A
CS:46D0 E89908 CALL 4F6C ;在输入法名称后显示':'
CS:46D3 58
POP AX ;弹出汉字的机内码
CS:46D4 50
在有关软件开发中,往往需要一种按一定结构存放的易 于操作的汉字输入码表来配合,以实现特定的功能。如专业 词库以拼音为序的排序,药品名称以拼音首字符为检索码的 检索方法的实现,以及汉字的拼音读音标注等。这一切,对 于那些手头没有合适的汉字编码对照表的普通编程人员来 讲,很容易陷入困境。显然,如何获得汉字的某种输入码 (编码)是组织具有可操作性码表的关键,也是解决上述问题 的基础。
如何得到可操作的汉字的输入码?仅以FoxBASE应用
程序为例进行示范。其基本思想是,由FoxBASE的内存变
量提供汉字,通过调用后面设计的汇编子程序查得汉字的输
入码并将其返回到原内存变量中,从而得到了可操作的汉字
输入码。
现立足于获得汉字的全拼输入码(Alt+F2对应的输入法 )
的想法,并根据FoxBASE调用汇编语言子程序的约定,可
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 ;以下是从数据区中逐一取出输入码பைடு நூலகம்
;有反查输入码程序入口 ?
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
CS:469D B03E MOV AL,3E CS:469F E8CA08 CALL 4F6C ;显示'>' CS:46A2 58 POP AX ;弹出汉字机内码,准备反查输入码
CS:46A3 B300
MOV BL,00 ;BL为由LIMD加载输入法时指定的
CS:46A5 FEC3 INC BL ;切换键序号,如Alt+F2对应的BL=2
而LIMD在加载输入法时,除将被加载输入法的一些重 要数据载入内存外,还将输入法名称和反查输入码的入口地 址填入KNL为它预留的注册项中,当然若该输入法不具有输 入码反查功能的话,则注册项中用于存放反查输入码程序入 口地址的单元将保持4字节0FFH不变。
还必须说明的是,LIMD每加载一次就又重新接管、重 置16H中断程序,但它不重置08H中断程序。也就是说,当 KNL.COM驻留后无论后续再加载或驻留UCDOS的什么功能 模块,8H中断它都不再被接管和重置,因此,输入法的注 册项可通过新的8H中断的段地址来访问,即输入法注册项 的段地址为KNL.COM重置后的8H中断的段地址。
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]这个远程调
用完成的正是反查输入码的功能(限于篇幅,代码略)。分析
表明,这个远程调用的入口参数是,AX为汉字的机内码,
DS:[BX+0C]为反查输入码程序入口;出口参数是,AX、
BX、DX为返回的输入码,每8位代表一个输入码,即最大
码长为6。
4 获取汉字输入码的方法
基于以上分析,又考虑到KNL中的环境因素,只要在内
存中动态地对CS:46D3—46D8处的指令作如下的改造,就
但幸运的是,这两种汉字平台下的汉字输入法都具有反 查单个汉字输入码的功能,这个特点为有效获取汉字的输入 码提供了保证。即可以不通过与汉字编码文件交涉而是通过 利用它们反查汉字输入码的机制求得问题的妥善解决。
下面以UCDOS6.0为例来讨论获取汉字输入码的方法 与实现过程。
2 UCDOS6. 0汉字输入法的加载与特点
快速获取汉字任意输入码的方法与实现
李全忠, 张福岭 (山东农业大学理学院,泰安 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
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:46A7 80FB06 CMP BL,06 ;Alt+F6为英文方式切换,跳 过
CS:46AA 74F9 JZ 46A5
CS:46AC 80FB0A CMP BL,0A ;功能切换键序号大于10?
CS:46AF 774F JA 4700
;是,全部查完,结束
CS:46B1 53
PUSH BX
CS:46B2 50
第 28卷 第 3期 Vol.28 № 3
计 算 机 工 程 Computer Engineering
2002年 3月 March 2002
· 开 发 研 究 与 设 计 技 术 · 文章编号: 1000— 3428(2002)03 — 0262— 03
文献标识码:A
中图分类号: TP391.12