下面的贴子可以解决你的问题:
主 题:请教高手:请问如何根据汉字反查编码?
作 者: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分
在输入法的反查编码的功能里并不能反查全部的输入法编码,可见不是所有的输入法支持编码反查
主 题:请教高手:请问如何根据汉字反查编码?
作 者: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分
在输入法的反查编码的功能里并不能反查全部的输入法编码,可见不是所有的输入法支持编码反查
我折腾了半天,总是搞不定ImmGetConversionList 之类的函数是来自哪里的?
望指教。
我的设想是:
根据拼音输入法的反查编码,将编码形成.txt文件,然后将词组去掉,只留下单词,再只留下拼时中的声母,表中的字段有人名、拼音名,这样一来就,可以根据你输入的拼音串来模糊匹配人名了,这样在查询时比输入汉字来要方便得多,这就是许多帮助系统中常见的功能。
所以只要获取一个汉字的asc码,就可以按大小排序了.至少我是这么想的.
但jilimi他老兄的要求就多了,不但要拼音,还要五笔,仓吉还有别的不知什么人创造的什么码的源码,这这就有点那个什么的嘛....大家说是不是:)
To gameboy999:
我不是用来排序的,就要它的读音。
To pjy 和 YangYun:
你们是不是都通过新建一个汉字-拼音的文件来实现,而不是直接通过编码反查来获得所需要的东西?
To all the readers:
不瞒大家说 我是在做一个小玩意 用于成语接龙的,一个成语的 接下去的那个的首字必须和前一个尾字同字或同音,同字很容易解决;但同音一时搞不定,所以我觉得需要这么一个功能。大家看看是不是还有其他变通的办法?
我回家去了,今天才回来