minigui输入法汉字的获取

minigui的中文输入法是内嵌在mgi库中的,现在把它剥离出来,从而实现自定义的定制。

1. 前言

经过各种调试,现在能实现的功能:输入拼音字母,返回中文候选字/候选词,而点击候选字显示联想字应该也是一样道理,尚未调试。

这里共用到了3个文件:ime_pinyin.c, ime_pinyin.h, ime_tab_pinyin.h

其中ime_tab_pinyin.h是词库,即你输入拼音,然后返回对应的汉字/词,举例:输入ni, 会出现 你 尼 拟 妮 泥 倪 …

词库文件的制作可以参看大神的文章:minigui词库更新

2. 下面说一下主要函数:

下面说一下主要函数:
说明:
所有的函数中使用的字符串长度最大值是32

#define  SW_STR_LEN 32 

A. 拼音转汉字函数

int pinyin_translate_word(void *method, const char *strokes, char *buffer, int buffer_len, int index)

函数说明:该函数输入一个字符串,会返回候选汉字。
参数说明
method: 这里没有用,传NULL就行;

strokes: 输入的字符串,比如ni

buffer: 返回的字/ 词语(注意:这里返回的汉字是gb2312格式)

buffer_len: 这里不太明白具体含义,不过一般传入32,传入32时返回的汉字个数是10,如果改大了,那么就会返回大于10个汉字。

index: 从词库匹配的第几个汉字开始返回,举例输入ni,那么词库中ni的前20个汉字是:你 泥 尼 呢 逆 拟 尿 妮 霓 倪 匿 腻 溺 伲 坭 猊 怩 昵 旎 祢,此时index传入0的话,会返回前10个汉字,传入2的话,会返回第2-12个汉字。

返回值:本次返回汉字中最后一个汉字在整个匹配汉字中的索引。举例:buffer_len 输入32,index输入0的时候,返回值是10,index是5的时候,返回值是15.

备注:返回的汉字有时候有不对的情况,比如上面输入ni 结果返回的汉字中有个"尿"字…,这是因为词库不准确导致的。另外输入nihao,不会返回你好,是因为词库中没有nihao这个字符串, 所以维护词库也是个重要的事情。

B. 汉字联想函数

int pinyin_predict_pord(void *method, const char *lookfor, char * buffer, int buffer_len, int index);

函数说明:该函数输入一个汉字,会返回该汉字的联想汉字。比如输入你,会返回:“好”,“的”,“们”,“在”,“是” 等可以和"你"组词的汉字
参数说明:和上面函数类似(目前尚未测试该函数)
返回值:未测试
备注: 未测试

C. 字符串拼接函数

void append(char* str, char c, int len, int flag)

函数说明:该函数将输入的单个字符拼接成字符串。
备注:len一般传入 SW_STR_LEN - 2, flag 这里用不到

D. 字符串转小写函数

void strcpylower(char* buf, const char* str)

函数说明:函数A拼音转汉字函数要求输入的字符串是小写,因此需要先用该函数转一下,再调用函数A

3. 调用流程

1) 定义字符串

定义一个输入字符串:

char in_str[SW_STR_LEN]

一个输入转换字符串:

char in_str_tmp[SW_STR_LEN]

和一个输出字符串:

char out_str[SW_STR_LEN].

2) 将输入的单个英语字符全部大写:

char ch = toupper('n');  
char ch1 =  toupper('i');

3) 使用append函数将步骤2中的字符拼接到字符串中:

append(in_str_tmp, ch, SW_STR_LEN - 2, 2);
append(in_str_tmp, ch1, SW_STR_LEN - 2, 2);

4) 使用strcpylower将步骤3中的字符串全部转化为小写:

strcpylower(in_str, in_str_tmp);

5) 调用 pinyin_translate_word函数得到候选字:

pinyin_translate_word(NULL, in_str, out_str, SW_STR_LEN, 0);

说明:

  1. 由上面步骤可以看出其实如果能保证输入的都是小写的话,只用步骤3即可。
  2. 上面得到的out_str是候选汉字的字符串数组,是gb2312格式的,有的情况下可能需要转成utf8格式才能正常显示,转换函数如下,其中buffer是转换之后的字符串,characters是步骤5中的out_str,length是out_str的长度,encode是编码方式,这里是”gb2312“
int convert2utf8(unsigned char *buffer, const unsigned char* characters, size_t mbs_length, char* encode)
{
    int conved_mbs_len, ucs_len;
    char buffer2[1024];
    PLOGFONT logfont = CreateLogFont (NULL, "arial", encode,
            FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
            FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,
            12, 0); 
    assert(logfont);
    const unsigned char* source = characters;
    ucs_len = MBS2WCSEx (logfont, (void *)buffer2, FALSE,  source, mbs_length, sizeof(buffer2),  &conved_mbs_len); 
    DestroyLogFont(logfont);
    logfont = CreateLogFont (NULL, "arial", "utf8",
            FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL,
            FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE,
            12, 0); 
    assert(logfont);
    ucs_len = WCS2MBSEx (logfont, (unsigned char *)buffer,   (unsigned char *)buffer2, 
            ucs_len, FALSE, sizeof(buffer2),  &conved_mbs_len); 
    DestroyLogFont(logfont); 
    return ucs_len; 
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值