LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: yjmsir

我已经将fcitx移植到window下的freepy自由拼音输入法中,将其变成自由拼音开源五笔输

[复制链接]
 楼主| 发表于 2004-10-27 14:50:19 | 显示全部楼层
接下来,我遇到一个问题,即多个程序调用输入法时,会产生多个副本,而且各个副本各自为政,最后保存的用户词库会覆盖了先前词库。至今我还没有根本的解决方法。只是采用了如下的临时方法:在保存前先读入用户词库的方法,来保证用户所造之词不丢失。而系统词库没有采用相应的措施,可能损失一些词频信息。
我想根本的解决方法是让多个副本共享一个码表,这个办法是否可行?如果可行,如何编程较好?请高手指点迷津。
 楼主| 发表于 2004-10-27 15:07:15 | 显示全部楼层
以下的您的半自动加码函数,我加了个BOOL InsertIt,如果此值为1,将执行插入码表操作,如果为0,不进行插入操作,只将编码复制到全局变量AutoWuBiCode中。
这个函数仅适用于用户选定一个字符串时,并且提交此函数取得编码。所以我把它称为半自动加码函数。

BOOL AutoGetWordWubiCode (char *strHZ,BOOL InsertIt)
{
    char *str1, *str2, *str3, *str4;
        char HZ1[3],HZ2[3],HZ3[3],HZ4[3];
    BOOL bCanntFindWuBi = 0;
        WORD strHZlen=_tcslen(strHZ);
        char strWubiCodeDisplayed[5];
        strWubiCodeDisplayed[4]='\0';
        HZ1[2]=HZ2[2]=HZ3[2]=HZ4[2]='\0';
        HZ1[0]=strHZ[0];
        HZ1[1]=strHZ[1];
        HZ2[0]=strHZ[2];
        HZ2[1]=strHZ[3];

    str1 = (char *) FindWuBiCode (HZ1);
    str2 = (char *) FindWuBiCode (HZ2);

    if (!str1 || !str2)
        bCanntFindWuBi = 1;
    else {
        if (strHZlen == 4) {
            strWubiCodeDisplayed[0] = str1[0];
            strWubiCodeDisplayed[1] = str1[1];
            strWubiCodeDisplayed[2] = str2[0];
            strWubiCodeDisplayed[3] = str2[1];
                 if(strWubiCodeDisplayed[1]=='\0'){//如果,为*FindWuBiCode开放到单码作准备
                        strWubiCodeDisplayed[1]=strWubiCodeDisplayed[2];
                        strWubiCodeDisplayed[2]=strWubiCodeDisplayed[3];
                }
        }
        else if (strHZlen == 6) {
        HZ3[0]=strHZ[4];
        HZ3[1]=strHZ[5];       
            str3 = (char *) FindWuBiCode (HZ3);
            if (!str3)
                bCanntFindWuBi = 1;
            else {
                strWubiCodeDisplayed[0] = str1[0];
                strWubiCodeDisplayed[1] = str2[0];
                strWubiCodeDisplayed[2] = str3[0];
                strWubiCodeDisplayed[3] = str3[1];
            }
        }
        else {
        HZ3[0]=strHZ[4];
        HZ3[1]=strHZ[5];
        HZ4[0]=strHZ[strHZlen-2];
        HZ4[1]=strHZ[strHZlen-1];
            str3 = (char *) FindWuBiCode (HZ3);
            str4 = (char *) FindWuBiCode (HZ4);
            if (!str3 || !str4)
                bCanntFindWuBi = 1;
            else {
                strWubiCodeDisplayed[0] = str1[0];
                strWubiCodeDisplayed[1] = str2[0];
                strWubiCodeDisplayed[2] = str3[0];
                strWubiCodeDisplayed[3] = str4[0];
            }
        }
    }
       
    if (bCanntFindWuBi) return 0;
        else {
                if(InsertIt){
                        InsertPhrase (strWubiCodeDisplayed, strHZ);
                }
                else _tcscpy(AutoWuBiCode,strWubiCodeDisplayed);
                return 1;
        }
}
 楼主| 发表于 2004-10-27 15:13:43 | 显示全部楼层
以下是全自动加码的程序段。对于用户输入的最近的50个汉字中的任意连续的2至8个汉字的词组,当给出按照五笔规则的编码将自动出现在候选框中,如果用户选用此候选词,就执行插入五笔库的操作,否则被放弃。


//查找最后输入的MAXAUTOWUBINUM/2个汉字中是否与输入的编码相同,已经完成!
if(wStrLen==4){//如果已经输入了四个编码
        WordHistoryStrLen=_tcslen(WordHistoryStr);
        for(i=4;i<=MAXAUTOWUBINUM && i<=WordHistoryStrLen;i+=2){
                AutoWuBiBeginNum=WordHistoryStrLen-i;
                HalfAutoWuBiBeginNum=AutoWuBiBeginNum/2;
//双字词
                if(i>=4){
                                _tcscpy(TempAutoWubi,HistoryTwoCodes+AutoWuBiBeginNum);
                                TempAutoWubi[4]='\0';
                                if(!_tcscmp(TempAutoWubi,lpStr)){
                                _tcscpy(AutoWuBiCode,TempAutoWubi);
                                _tcscpy(AutoWuBiCode1,AutoWuBiCode);
                                //取得两汉字串
                                _tcscpy(TempAutoWubi,WordHistoryStr+AutoWuBiBeginNum);
                                TempAutoWubi[4]='\0';
                                _tcscpy(AutoWuBiWord,TempAutoWubi);
                                HaveAutoCandList=1;
                                goto next;
                                }
                }
//三字词
                if(i>=6){
                                _tcscpy(TempAutoWubi,HistoryFirstCode+HalfAutoWuBiBeginNum);
                                TempAutoWubi[2]='\0';
                                _tcscat(TempAutoWubi,HistoryTwoCodes+AutoWuBiBeginNum+4);
                                TempAutoWubi[4]='\0';
                                if(!_tcscmp(TempAutoWubi,lpStr)){
                                _tcscpy(AutoWuBiCode,TempAutoWubi);
                                _tcscpy(AutoWuBiCode1,AutoWuBiCode);
                                //取得三汉字串
                                _tcscpy(TempAutoWubi,WordHistoryStr+AutoWuBiBeginNum);
                                TempAutoWubi[6]='\0';
                                _tcscpy(AutoWuBiWord,TempAutoWubi);
                                HaveAutoCandList=1;
                                goto next;
                                }
                }
//四字词
                if(i>=8){
                                _tcscpy(TempAutoWubi,HistoryFirstCode+HalfAutoWuBiBeginNum);
                                TempAutoWubi[4]='\0';
                                if(!_tcscmp(TempAutoWubi,lpStr)){
                                _tcscpy(AutoWuBiCode,TempAutoWubi);
                                _tcscpy(AutoWuBiCode1,AutoWuBiCode);
                                //取得四汉字串
                                _tcscpy(TempAutoWubi,WordHistoryStr+AutoWuBiBeginNum);
                                TempAutoWubi[8]='\0';
                                _tcscpy(AutoWuBiWord,TempAutoWubi);
                                HaveAutoCandList=1;
                                goto next;
                                }
                }
///五个字到八个字方案一
                if(i>=10){
                        for(j=10;(j<=i)&&(j<=16);j+=2){
                                _tcscpy(TempAutoWubi,HistoryFirstCode+HalfAutoWuBiBeginNum);
                                TempAutoWubi[3]='\0';
                                _tcscat(TempAutoWubi,HistoryFirstCode+HalfAutoWuBiBeginNum+j/2-1);
                                TempAutoWubi[4]='\0';
                                if(!_tcscmp(TempAutoWubi,lpStr)){
                                _tcscpy(AutoWuBiCode,TempAutoWubi);
                                _tcscpy(AutoWuBiCode1,AutoWuBiCode);
                                //取得五个字到八个字汉字串
                                _tcscpy(TempAutoWubi,WordHistoryStr+AutoWuBiBeginNum);
                                TempAutoWubi[j]='\0';
                                _tcscpy(AutoWuBiWord,TempAutoWubi);
                                HaveAutoCandList=1;
                                goto next;
                                }
                        }
                }
//
//五个字到八个字方案二
//
        }
}
HaveAutoCandList=0;
next:
 楼主| 发表于 2004-10-27 15:18:23 | 显示全部楼层
最初由 yjmsir 发表
Yuking你好。
经过编程,我才发现你对五笔编码的编排方式是最高效的。
以前,有个网友要求你将码表按ucdos或者极点中文的方式排列,我试验了一下,发现不但编程麻烦大了,而且输入的反映也慢了,完全失去了fcitx输入时的轻灵的感觉。所以我又采用了你的码表方式。
因为我是业余编程爱好者,所以水平有限,只是利用空闲时间,分析代码,看懂一部分后,刚思索可改进的地方,接着设定步骤改进,调试,所以进度不快。
我在分析了你的1.8.5的五笔部分的代码后,结合对freepy的分析,将fcitx五笔部分的几个函数移植过去。现在刚刚完成对词频调整,查询五笔编码的移植。但使用的感觉已经很好。
由于对自动造词的机制不是很清楚,现在正在摸索学习中。不知您能否告诉我。
关于代码,我将邮寄给您。还得先谢谢您开放了fcitx的原码。
在这个输入法中,我加入了一个特别的功能,就是汉字输入日文输入的转换,这是我在学习使用日语时的一个想法,借助于fcitx与freepy,将它实现,心里也是很快乐的。还实现了相似的入简出繁的功能。再加上原有的入简出big5码的功能,这些将是这个输入法的一个亮点。此外,区位码输入法也改进得很方便使用,可以用翻页键实现方便的浏览。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表