下面的贴子可以解决你的问题:
主  题:请教高手:请问如何根据汉字反查编码?
作  者:Jilimi
所属论坛:Delphi
问题点数:100
回复次数:12
发表时间:2000-12-26 0:14:00
 
  请问如何根据任意一个汉字,反查出当前系统中已安装的各输入法的编码?
  例如:我的机器上已安装了五笔输入法、微软拼音输入法,则如果传入“一”字,如何求出“五笔:g  微软拼音:yi1”这样的结果?
  好像用 ImmGetConversionList 可以做到,但我只能查到微软拼音的编码,其它的输入法都不行,这是为什么?是不是下面这段代码有错?下面附上源代码,请各位高手帮我解决一下,我很急,谢谢!
function QueryCompStr(hKB: HKL; const sChinese: AnsiString): string;
var
  dwGCL: DWORD;
  szBuffer: array[0..254] of char;
  iMaxKey, iStart, i: integer;
begin
  Result := '';
  iMaxKey := ImmEscape(hKB, 0, IME_ESC_MAX_KEY, nil);
  if iMaxKey <= 0 then exit;  dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),nil,0,GCL_REVERSECONVERSION);
  if dwGCL <= 0 then Exit;   dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),@szBuffer,dwGCL,GCL_REVERSECONVERSION);  if dwGCL > 0 then
  begin
    iStart := byte(szBuffer[24]);
    for i := iStart to iStart + iMaxKey * 2 do
      AppendStr(Result, szBuffer[i]);
  end;
end; 
回复贴子: 
回复人:Jilimi(2000-12-26 0:16:00)  得0分 
  请大家帮帮忙,我很急,谢谢! 
 
回复人:Jilimi(2000-12-26 18:26:00)  得0分 
  都一天了,怎么没有一个人回答我?难道这个问题那么难吗? 
 
回复人:nononono(2000-12-26 18:40:00)  得0分 
不是所有的输入法都支持这种功能吧? 
 
回复人:BCB(2000-12-27 8:41:00)  得0分 
我想大家不是不邦忙,可能邦不了,未弄过;
我编程,若要拼音码,一般都是自行备好,
不知道怎样在线取编码,另处可能用户未装这种编码。
 
 
回复人:Jilimi(2000-12-27 13:34:00)  得0分 
“打开五笔输入法,输入法设置->编码查询,选择相应的输入法”
通过以上方法,可以反查出我机器上已经安装的五笔字形、微软拼音、全拼、双拼、智能ABC、郑码等的编码来,而且不止是五笔输入法,其它输入法也大都可以做到。即然那些输入法或MS能做到,那我们也一定能做到,只是应该如何去做呢?为什么上面那段代码只能查到微软拼音的编码,而其它的却都不行呢?
    下面附上调用上面的函数的代码,请知道的高手速速帮忙,我很急,谢谢!
procedure TfrmQueryComposition.btnExecuteClick(Sender: TObject);
var
  iHandleCount: integer;
  pList: array[1..nHKL_LIST] of HKL;
  szImeName: array[0..254] of char;
  i: integer;
  sFound: string;
begin
  lstComposition.Items.Clear;
  // 取得目前系统已安装输入法之各个键盘配置(Keyboard Layout)
  iHandleCount := GetKeyboardLayoutList(nHKL_LIST, pList);
  for i := 1 to iHandleCount do
  begin
    if ImmEscape(pList[i], 0, IME_ESC_IME_NAME, @szImeName) > 0 then
    begin
      sFound := QueryCompStr(pList[i], edtExam.Text);
      if sFound <> '' then
        lstComposition.Items.Add(StrPas(szImeName) + ': ' + sFound);
    end;
  end;
end; { of btnExecuteClick }
 
 
回复人:mutant(2000-12-27 13:42:00)  得0分 
可以将各种输入法的文件用输入法生成器反解出来存为文本文件(格式很简单,用Notepad看看就明白了)
这种文件的正向使用方法是根据输入的键值查询相应的汉字或词组,当然反过来用也可以,根据汉字或词组查出相应的编码,不过可能速度不是很快就是了.
Imm*函数没有用过 
 
回复人:Kingron(2000-12-27 16:07:00)  得0分 
找了半天,只发现下面这句有问题,不知道错在那个地方。那个szBuffer应该是一个结构!
dwGCL := ImmGetConversionList(hKB,0,pchar(sChinese),@szBuffer,dwGCL,GCL_REVERSECONVERSION);
 
 
回复人:The_east_key(2000-12-29 13:29:00)  得0分 
建议您访问www.etechbase.net/tech,里面有很多资料,也许可以解决您的问题。
访问http://168.168.18.11:81/etechbase/advsearch.php将您的问题输入查询内容框,选择不同的精确程度,即可以找到你所需要的答案。效果还是可以的。 
 
回复人:Jilimi(2000-12-30 15:17:00)  得0分 
To The_east_key:
  你给的地址我上不去呀?
 
 
回复人:Ailler(2000-12-30 16:13:00)  得0分 
  关注!!! 
 
回复人:wjxcn(2000-12-30 17:02:00)  得0分 
在输入法的反查编码的功能里并不能反查全部的输入法编码,可见不是所有的输入法支持编码反查 

解决方案 »

  1.   

    To Kingron:
        我折腾了半天,总是搞不定ImmGetConversionList 之类的函数是来自哪里的?
        望指教。
      

  2.   

        我也有过此想法,在查询中只需输入人名中每个字的声母,然后每输入一个声母,列表框中就检索出库中的人名。
        我的设想是:
        根据拼音输入法的反查编码,将编码形成.txt文件,然后将词组去掉,只留下单词,再只留下拼时中的声母,表中的字段有人名、拼音名,这样一来就,可以根据你输入的拼音串来模糊匹配人名了,这样在查询时比输入汉字来要方便得多,这就是许多帮助系统中常见的功能。
      

  3.   

    我想一个汉字至少支持国标吧,国标可是按拼音排序的喔...
    所以只要获取一个汉字的asc码,就可以按大小排序了.至少我是这么想的.
    但jilimi他老兄的要求就多了,不但要拼音,还要五笔,仓吉还有别的不知什么人创造的什么码的源码,这这就有点那个什么的嘛....大家说是不是:)
      

  4.   

     感谢大家的参与 :)
     
     To  gameboy999:
         我不是用来排序的,就要它的读音。
     To pjy 和 YangYun:
         你们是不是都通过新建一个汉字-拼音的文件来实现,而不是直接通过编码反查来获得所需要的东西?
     
     To all the readers:
         不瞒大家说 我是在做一个小玩意 用于成语接龙的,一个成语的 接下去的那个的首字必须和前一个尾字同字或同音,同字很容易解决;但同音一时搞不定,所以我觉得需要这么一个功能。大家看看是不是还有其他变通的办法?
      

  5.   

    爱,在Imm单元啊!
    我回家去了,今天才回来
      

  6.   

    放假那么久?? 呵呵,真有你的。我已经完成了,直接使用IMM单元里的函数。