/** 获得汉字笔划的拼音串,用于显示笔划候选 */ void GetZiBHPinyin(UC zi, TCHAR *buffer, int length) { int i, first; TCHAR s_str[0x30]; int s_len; SYLLABLE s; if (!buffer || !length || length < sizeof(HZ) + 1) return; if (!share_segment->hz_data_loaded) LoadHZDataResource(); if (!hz_data) { hz_data = GetReadOnlySharedMemory(hz_data_share_name); //可能存在其他进程已经装载了,但是退出后共享内存被释放的问题 if (!hz_data && share_segment->hz_data_loaded) { share_segment->hz_data_loaded = 0; LoadHZDataResource(); } } if (!hz_data) { buffer[0] = 0; return; } UCS32ToUCS16(zi, buffer); first = 1; for (i = 0; i < hz_data->hz_count; i++) { if (hz_data->hz_item[i].hz != zi) continue; s = hz_data->hz_item[i].syllable; s_len = GetSyllableString(s, s_str, _SizeOf(s_str),/* 0,*/ 1); if (s_len + (int)_tcslen(buffer) + 2 >= length - 1) return; if (first) _tcscat_s(buffer, length, TEXT("(")); else _tcscat_s(buffer, length, TEXT(",")); _tcscat_s(buffer, length, s_str); first = 0; } if (!first) _tcscat_s(buffer, length, TEXT(")")); }
/** Reload Zi resource */ int WINAPI PIM_ReloadZiResource() { FreeHZDataResource(); LoadHZDataResource(); return 1; }
/** 装载输入法使用的资源,如果失败,则输入法不起作用 * 返回: * 成功:1,失败:0 */ int PIM_LoadResources() { LoadWordLibraryResource(); //词库 LoadBigramResource(); //Bigram数据 if (share_segment->resource_loaded) return 1; share_segment->resource_loaded = 1; LoadSpwResource(); //短语 LoadTopZiResource(); //置顶字 LoadZiCacheResource(); //汉字Cache LoadHZDataResource(); //装载汉字数据 LoadCiCacheResource(); //词Cache //LoadNewWordTable(); //新词表 LoadSPResource(); //装载双拼资源 LoadSymbolResource(); //装载中文符号资源 LoadFontMapResource(); //load font map GenGBKMapResource(); //load gbk map // LoadEnglishResource(); //装载英文词典数据 // LoadEnglishTransResource(); //装载英文翻译数据 // LoadURLResource(); //装载URL数据 // LoadBHResource(); //装载笔划数据文件 return 1; }
/* 获得汉字候选。 * 参数: * syllable 音节 * candidate_array 候选数组 * array_length 候选数组长度 * fuzzy_mode 模糊设置 * set_mode 汉字集合选项:常用(进化)、全集 * output_mode 字输出选项:繁体、简体 * 注:如果为繁体,则肯定是全集汉字集合。 * 返回: * 候选汉字数目。 */ int GetZiCandidates(SYLLABLE syllable, CANDIDATE *candidate_array, int array_length, int fuzzy_mode, int set_mode, int output_mode) { int i, j, count; //候选计数器 int topzi_count; //置顶字数目 HZ top_zi[MAX_TOPZI]; //置顶字 int check_top_zcs_fuzzy = 0; //置顶字zcs模糊 extern int LoadHZDataResource(); if (!array_length) return 0; if (!share_segment->hz_data_loaded) LoadHZDataResource(); if (!hz_data) { hz_data = GetReadOnlySharedMemory(hz_data_share_name); //可能存在其他进程已经装载了,但是退出后共享内存被释放的问题 if (!hz_data && share_segment->hz_data_loaded) { share_segment->hz_data_loaded = 0; LoadHZDataResource(); } } if (!hz_data) return 0; topzi_count = GetTopZi(syllable, top_zi); //由于s=是,c=出,z=中重 的设置,所以必须对zcs的模糊进行处理,找出 //带有固定字的候选 if (topzi_count && syllable.vow == VOW_NULL && (syllable.con == CON_Z || syllable.con == CON_C || syllable.con == CON_S)) check_top_zcs_fuzzy = 1; count = 0; //检索汉字 for (i = 0; i < hz_data->hz_count; i++) { //判断简繁体是否符合 if (!( ((output_mode & HZ_OUTPUT_HANZI_ALL)) || //输出全集汉字 ((output_mode & HZ_OUTPUT_ICW_ZI) && hz_data->hz_item[i].icw_hz) || //输出ICW使用的汉字 ((output_mode & HZ_OUTPUT_SIMPLIFIED) && hz_data->hz_item[i].simplified) || //输出简体字,字是简体 ((output_mode & HZ_OUTPUT_TRADITIONAL) && (hz_data->hz_item[i].traditional || hz_data->hz_item[i].other)) //输出繁体字,字是繁体或该字未分类 )) continue; if (check_top_zcs_fuzzy) { if (!ContainSyllableWithTone(syllable, hz_data->hz_item[i].syllable, fuzzy_mode | FUZZY_Z_ZH | FUZZY_C_CH | FUZZY_S_SH)) continue; //判断是否为置顶字 for (j = 0; j < topzi_count; j++) if (top_zi[j] == LOWORD(hz_data->hz_item[i].hz)) break; //不是置顶字的话,需要重新进行音调的判断 if (j == topzi_count) if (!ContainSyllableWithTone(syllable, hz_data->hz_item[i].syllable, fuzzy_mode)) continue; //拼音不相符 } else if (!ContainSyllableWithTone(syllable, hz_data->hz_item[i].syllable, fuzzy_mode)) continue; //拼音不相符 candidate_array[count].type = CAND_TYPE_ZI; candidate_array[count].hz.is_word = 0; candidate_array[count].hz.item = &hz_data->hz_item[i]; candidate_array[count].hz.hz_type = ZI_TYPE_NORMAL; //判断是否为置顶字 for (j = 0; j < topzi_count; j++) if (top_zi[j] == LOWORD(hz_data->hz_item[i].hz)) break; //设置置顶字序号,如果没有,则设为最大值 if (j == topzi_count) j = DEFAULT_TOP_POS; candidate_array[count].hz.top_pos = j; count++; if (count >= array_length) //数组过长 break; } return count; }