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);
说明:
- 由上面步骤可以看出其实如果能保证输入的都是小写的话,只用步骤3即可。
- 上面得到的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;
}