回 帖 发 新 帖 刷新版面

主题:中文输入法的实现过程(转贴)

中文输入法的实现过程:(本贴转自BAS写QBWIN的说明)
       首先,我们来说一下ASCII码与CHR$字符的关系,我们都清楚从0到31是文本控制符,32到127都是英文、数字及
一些常用字符。如:a$ = CHR$(65) ,对应的 a$ = "A"。而中文字符的ASCII范围是从160到255。中文字是由两个字
符组成的,所以一个中文字是由两个从160到255的组合字符构成。如 a$ = CHR$(206) + CHR$(210)。对应变量 
a$ = "我"。相反如果想知道一个中文字是由那两个ASCII码组成,我们可以将它拆成两个字符,用ASC()函数就可
知道它的相对ASCII码值。如:
   PRINT ASC( LEFT$(a$ ,1));
   PRINT ASC(RIGHT$(a$ ,1))
结果显示:206  210
        现在我们都明白了中文字的ASCII码组合,我们先来做最简单的“区位”输入法。区位输入的码表纯粹是ASCII的
顺序排列。所以我们只要将区位前两位数+160,后两位数也+160。再将两个数加起来。例如:
    QW = 2532
    ZWF = QW \ 100 + 160          '区位前两位数+160
    ZWB = QW MOD 100 + 160        '后两位数+160
    A$ = CHR$(ZWF) + CHR$(ZWB)    '两个数加起来形成区位表码对应的字符
    
     大家都看到区位输入法的实现就是如此鸡毛蒜皮的事件。现在我们再来实现“拼音”输入法。如果大家执行以下
代码:
    FOR F = 160 TO 255
      FOR B= 160 TO 255
        PRINT CHR$(F) + CHR$(B) ;
      NEXT B
    NEXT F

稍认真看看规律就不难发现它的ASCII码值是按拼音来排列的。除了声调,拼音的重码是非常多的。这样我们就无须每
个字都作拼音码表检索。反之是用拼音来检索所有重码的字就更简单了。如:输入“wo”,即从(206,210)开始就
是拼音“wo”所有重码的字符。其它也依次类推。“拼音”输入法虽然没区位简单,但也是不难实现的。用上述的方法
来实现“拼音”输入是最简捷的方法,但存在一个缺点:就是它只能输入日常常用的字,即只是从160到214之间,算一算
大概有5000个常用字。还有3000多个不常用字的排序方法与之不同,后3000多字是以笔画方式排序的。如果要想实现
一个完整的,就是能输入所有常用及不常用汉字的“拼音”输入法,那么就要专门建立一个“拼音”输入码表检索文件。
在这里就不多谈了。如果有兴趣自己试试。。。。

    简单的“拼音”输入法我们都实现了,但“拼音”的输入速度就以它的重码有着莫大的关系。所以我们现在来实现
最常用的、效率高、重码率低、一个我们中国人“王永民”先生设计的输入法“五笔”输入法。这个不用说了,会打
字的一般都认识“五笔”。打五笔我们就打得多了,但“五笔”输入法是如何实现呢?不清楚的QB朋友不用抓头皮,
看下去你就会理直气壮的说:“原来就这么简单!!!”
    “五笔”不同于以上“拼音”与“区位”输入法,它在ASCII码表里是没有一个排列规律的,ASCII码这个国际通
用的码表排列,我们是不能随便就更改。既然更改ASCII码表的排列是不可能的事情,我们只好自己做个“五笔”编
码专用的码表好了!!。请看以下源代码程序:

    WBX$ = " ggtt=五笔 lwty=输入 ifc=法 yijg=就是 vftc=那么 tuuj=简单 "
    WBX$ = WBX$ + " q=我 bn=也 go=来 yaya=试试 rhf=看 drgo=原来 r=的 pugm=实现 "    '定义一个基本的码表
    CLS
    PRINT WBX$
    PRINT
    PRINT "请你输入:"
    PRINT "原来五笔输入法的实现就是那么的简单我也来试试看"
    LOCATE 10, 5
    RecInputChr$ = " "          '初始化显示编码及定义光标位置
    PRINT "五笔编码: "
    DO
      IK$ = INKEY$              '读入键盘的ASCII码值

      IF IK$ = CHR$(27) THEN EXIT DO        '按ESC键退出

      IF IK$ = CHR$(13) THEN                '按Enter键重置编码
        InputChr$ = ""
      ELSEIF IK$ = CHR$(8) THEN             '按BackSpace键后退
        IF InputChr$ <> "" THEN InputChr$ = LEFT$(InputChr$, LEN(InputChr$) - 1)
      ELSEIF IK$ <> "" AND IK$ <> CHR$(32) THEN         '如果键入的不是空格键而且键盘有键按下时编码字符被键入新编码
        InputChr$ = InputChr$ + IK$
      END IF

      IF IK$ = CHR$(32) OR LEN(InputChr$) = 4 THEN      '如果按了空格键或够4码即执行码表检索
        II$ = " " + RTRIM$(InputChr$) + "="
        ST = INSTR(1, WBX$, II$)
        IF ST > 0 THEN
          ST = ST + LEN(InputChr$) + 2
          EN = INSTR(ST, WBX$, " ")
          IF EN = 0 THEN EN = LEN(WBX$)
          ZW$ = MID$(WBX$, ST, EN - ST)                 '检索到的编码字符
          TXT$ = TXT$ + ZW$                             '输入栏字符被输入编码的汉字
          LOCATE 6, 1: PRINT TXT$                       '显示输入的内容
        END IF
        InputChr$ = ""           '编码字符被重置
      END IF

      IF InputChr$ <> RecInputChr$ THEN          '如果当前编码与上次编码有改变即刷新
        LOCATE 10, 15
        PRINT InputChr$ + "    "                 '显示编码字符
        LOCATE 6, LEN(TXT$) + 1, 1               '定义输入栏光标位置
        RecInputChr$ = InputChr$                 '给上次编码赋最新编码内容值
      END IF

    LOOP

回复列表 (共7个回复)

沙发

在GB2312-80中,汉字内码的两个字节的ASCII值为161-254,因此最多能容纳94*94个汉字及其定义的字符。

板凳

先存起来慢慢看。

3 楼

FOR F = 160 TO 255
      FOR B= 160 TO 255
        PRINT CHR$(F) + CHR$(B) ;
      NEXT B
    NEXT F


我的机器怎么是乱麻啊?
哭啊!怎么回事?
我急着学习输出汉字!看到这正高兴着呢!
怎么输出的是乱麻啊?我用的是QB45有问题吗?等你回我啊
哭。。。。。

4 楼

QB本身并不包停含汉字信息
你需要外加汉字显示系统
比如说UCDOS,CCDOS等等

5 楼


你想争钱吗?我的视频店铺开张了,免费视频招聘,免费视频求职,免费视频简历,免费视频店铺,网上做生意 尽在我财网- www.51ccb.com 可以和店主进行讨价还价的网上视频店铺www.51ccb.com
 可以直接面对顾客,就象在贸易市场上开店那样,可以和顾客直接切磋,进行讨价还价,让网上的买卖回归现实,这一切就发生在www.51ccb.com,而且在这个网站开店永远是免费的,视频应聘软件下载
一个很好用的视频聊天,视频招聘,视频应聘软件 ,下载地址:http://www.51ccb.com/download/ccb2006_setup.exe 
只要你下载好这个软件你的梦想将在www.51ccb.com实现!!快快加入吧!! 
  

6 楼

可以说这只是最基本的知识!难道写中文输入法就这么简单吗?学过程序设计的谁都明白!如果真的要写个中文输入法,这点知识是肯定不够的,能否提供多一点?大家期待你....................

7 楼


     我是一个新手, 什么是UCDOS  怎么装。多谢了

我来回复

您尚未登录,请登录后再回复。点此登录或注册