edog

冰冻热狗
数据加载中……

用VC++6.0编程实现汉字拼音查找

VC++6.0编程实现汉字拼音查找

eDog[原创]

摘要   使用VC++6.0编程查找汉字的拼音

关键字   汉字,拼音,资源

http://www.cppblog.com/Files/edog/LookPY.rar

一、             引言

在读书看报或者浏览网上文章时候,经常会看到一些比较生僻的汉字而不知道其读音;或者有些汉字知道其写法,可以使用五笔等笔划输入法输入却不能使用拼音输入法输入。本文将演示怎么使用VC++6.0编写程序实现汉字的拼音的查找,对于多音字也可以把所有的拼音找出来。在网上看到生僻的汉字时,把汉字粘贴到本程序的输入框,就可以查找出这些汉字的拼音;或者使用五笔等输入法把汉字输入到本程序查找其拼音。可以有助于读者正确的使用汉语拼音。

 

二、             基础知识

1、本程序实现的原理是建立一张对应表,记录所有汉字和对应的拼音,根据输入框中的汉字在此对应表中查找出其拼音,对于多音字可以查找出多个拼音,表的结构为拼音在前,用空格或者TAB键分隔,具有此读音的汉字紧跟在后,每个拼音及其汉字占一行,如下为其中的两行:

 

a      啊阿呵吖嗄腌锕錒

ang  昂肮盎仰卬岇昻枊醃醠骯

 

2、可以把这个对应表保存在一个文件中,每次读取文件进行拼音的查找。为了使用上的方便,可以把此文件作为程序资源的一部分,附加在应用程序中,以后使用时只需要一个应用程序就可以正确运行了。在程序运行时候根据资源中的数据进行查找,而不需要去读取对应表文件。本例子程序中此对应表的资源类型命名为“PYGBK”,资源的IDIDR_PYGBK1。操作应用程序中的资源需要用到一些Windows API,如下:

HRSRC FindResource(      

    HMODULE hModule,
    LPCTSTR lpName,
    LPCTSTR lpType
);
此函数用于找到程序中的资源,输入参数分别为程序的实例句柄、资源名称和资源类型。返回资源的句柄。
DWORD SizeofResource(      

    HMODULE hModule,
    HRSRC hResInfo
);
此函数用于得到指定资源的大小,输入参数分别为程序的实例句柄和资源的句柄。返回资源大小的字节数。
HGLOBAL LoadResource(      

    HMODULE hModule,
    HRSRC hResInfo
);

此函数用于装入指定的资源,输入参数分别为程序的实例句柄和资源的句柄。返回指向资源数据的指针。

以上的Windows API的详细使用方法请参考MSDN

 

3、在开始查找汉字拼音之前,需要判断输入的汉字是否合法。比如用户输入了英文字符就会产生错误信息。对于简体中文汉字来说,每个汉字由两个字节组成,第一个字节的范围为0xA1~0xFF,第二个字节的范围为0x400xFF,根据此条件就可以判断输入的字符是否合法,程序上实现如下:

 

unsigned char ch = buf[j];

if( (((j+2)%2==0&& ch<0xA1|| (((j+2)%2)==1 && ch<0x40) )

                        
{

                                       
// 不合法的字符,返回

                        }


其中:buf为输入的汉字字符串(最多10个汉字20个字符),j为位移

        ((j+2)%2==0)表示ch为汉字的第一个字节

((j+2)%2==1)表示ch为汉字的第二个字节

有关汉字编码和拼音的知识请参考其他文档。

 

一、编程实现

1  创建一个基于对话框的MFC应用程序。

2  制作界面,如下图1所示:

3  把汉字拼音对应表导入为资源,定义资源名字为“PYGBK”,自动生成资源IDIDR_PYGBK1,这里需要注意的是在此资源的属性框中去掉“External file”的选择(缺省为选择),这样对应表才能真正导入到应用程序中,达到与外部文件的分离。

4  为输入框定义一个CString类型的变量m_Edit1,为列表框定义一个CListBox类型的变量m_List1

为查找按钮添加相应的关联函数,并在此函数中添加查找拼音的代码。具体算法为查找对应表中的所有汉字,如果找到就再查找其拼音并把与此汉字对应的所有拼音显示在列表框中。下图2为查找汉字串“蒹葭苍苍白露为霜”的结果。

5、主要函数代码:

 1// 查找按钮对应的函数
 2void CLookPYDlg::OnSearch() 
 3{
 4    m_List1.ResetContent();
 5    UpdateData();
 6    m_Edit1.TrimLeft();
 7    m_Edit1.TrimRight();
 8    if(m_Edit1.IsEmpty())    return;
 9    UINT i;
10    unsigned char ch;
11    for(int j=0; j<m_Edit1.GetLength(); j++)
12    {
13        ch = m_Edit1.GetAt(j);    // 汉字串中的第 i 个字符
14        // 判断汉字是否合法
15        if( (((j+2)%2==0&& ch<0xA1|| (((j+2)%2)==1 && ch<0x40) )
16        {
17            MessageBox("输入了非法的字符!", NULL, MB_ICONWARNING);
18            return;
19        }

20    }

21
22    HRSRC HGBSrc;
23    LPVOID GBTemp;
24    // 查找对应表资源
25    HGBSrc = FindResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_PYGBK1),"PYGBK");
26    if(HGBSrc == NULL)    return;
27    // 得到对应表数据的大小
28    DWORD size = SizeofResource(AfxGetInstanceHandle(), HGBSrc);
29    // 装入对应表
30    HGLOBAL m_HGBStr = LoadResource(AfxGetInstanceHandle(), HGBSrc);
31    // 锁定资源并得到数据指针
32    GBTemp = LockResource(m_HGBStr);
33    // 转换为 char 类型的指针
34    char *buf = (char *)GBTemp;
35
36    char hzstr[21], ss[50];
37    strcpy(hzstr, m_Edit1);
38    for(i=0; i<10; i++)    arPY[i][0]=0;
39    // 调用查找拼音的函数
40    this->SearchHZPY(buf, size, hzstr);
41    // 在列表框中显示结果
42    for(i=0; i<strlen(hzstr)/2; i++)
43    {
44        sprintf(ss, "%c%c - %s", hzstr[i*2], hzstr[i*2+1], arPY[i]);
45        m_List1.AddString(ss);
46    }

47}

48
49/*
50    查找拼音的函数
51    输入:    buf - 拼音和汉字的对应表数组
52            size- 此数组的大小
53            hzstr - 输入的汉字串,最多10个汉字
54    返回:true, 结果保存在 arPY 数组,arPY 为 10×50的字符数组,
55            用于保存与汉字对应的所有拼音
56*/

57bool CLookPYDlg::SearchHZPY(char *buf, long size, char *hzstr)
58{
59    char *ptr, str[1000], szPY[10], szHZ[1000];
60    long i, j, k, start=0, len, len2;
61    len2 = strlen(hzstr);    // 输入的汉字串的长度
62    for(i=0; i<size; i++)
63    {
64        if(buf[i]==0x0a)    // 到达行末
65        {
66            ptr = &buf[start];
67            len = i-start;    // 此行的长度
68            strncpy(str, ptr, len);    // 取此行的数据
69            str[len]=0;
70            start = i+1;    // 定位下一行的开始位置
71
72            sscanf(str, "%s %s", szPY, szHZ);    // 分离拼音和对应的汉字
73            len=strlen(szHZ);
74            // 循环查找
75            for(j=0; j<len; j=j+2)
76            {
77                for(k=0; k<len2; k=k+2)
78                {
79                    // 找到匹配结果
80                    if(szHZ[j]==hzstr[k] && szHZ[j+1]==hzstr[k+1])
81                    {
82                        strcat(arPY[k/2], szPY);
83                        strcat(arPY[k/2], "");
84                    }

85                }

86            }

87        }

88    }

89    return true;
90}


 

一、             小结

本文从原理和编程实现方面简单的介绍了汉字拼音查找的方法,并简单演示了怎么使用应用程序的资源。实现的关键为建立一张汉字和拼音的对应表并导入到应用程序中以达到应用程序与外部文件的分离。本程序在Windows98/2000环境使用VC++6.0编译通过。

11.jpg

posted on 2005-11-30 00:25 冰冻热狗 阅读(8078) 评论(28)  编辑 收藏 引用 所属分类: 应用程序

评论

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

太感动了...正寻找中。。。。。我是说呀,VC使用这么广泛,怎么可能没有VC的汉字转拼音的代码?


楼主,感谢中。。。
2006-03-01 21:28 | King

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

不过大哥怎么没把源代码一起上传呀。。
2006-03-01 21:33 | King

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

老大 我想跟你联系下,讨论下你的这个程序啊。你的程序运行不了,我已经修改了。但是现在的问题是读字典的时候读取的是null.
2006-05-16 15:01 |

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

什么意思?不懂,留下邮件地址或者联系我:comwell@126.com
2006-05-21 22:23 | 冰冻热狗

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

测试一下 "划" 字 很多字是不对的,他的那张表不准
2006-06-21 09:04 | 没用的

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

“划”-guo, hua, huai
你用全拼输入法,这三种拼音都可以打出“划”字,
很多字不对?还有那些字不对?请明示一下。
2006-06-22 12:44 | 冰冻热狗

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

2007-10-09 20:43 | 夫人法

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

我编写的结果是:列表框中只显示输入的汉字没有拼音,怎么解决
2008-01-11 18:05 | 真想学

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

这个原因就太多了,不知道你程序是怎么写的。就这样一句话,就别人怎么跟你说?
2008-01-12 00:00 | 冰冻热狗

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

尊敬的老师:
我按着你的教导,作了一个汉字拼音查找程序结果一直运行挺好,朋友非要给他用.我就把VC++的DEBUG中的目录中的PookPY.exe文件压缩后传给了他,结果不能用.一运行就提示:找不到MFC42D.DLL文件,希望你能告诉我,怎么做,朋友才能用我的PookPY.exe文件.谢谢,祝你春节好.全家幸福快乐.
2008-02-03 19:48 | 汤光大

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

这是VC的基本常识啦,重新编译一个Release版本就可以了,DEBUG版本的不能给别人用的。
2008-02-05 01:40 | 冰冻热狗

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

很不好意思,我是刚学习VC的老头,所以连VC的基本常识都没有的,因为不会就得向老师求教.
这也就是说“重新编译一个Release版本就可以了”这个知识我根本就没有接触过,麻烦老师。把我当成一个“白丁”(采鸟都不够)那个水平给我说说,怎么“编译一个Release版本”最好从头一步一步的给我讲一遍(我用的VC++6.0),老翁这里有礼了,谢谢好心的老师,谢谢。
2008-02-05 09:41 | 汤光大

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

我晕~~~看来兄台还要加强一下基础知识。

打开LookPY的工程后,在VC的界面中选择“Build”菜单下面的“Set Active Configuration”,出现一个对话框,选择“Win32 - Release”那一项,按“OK”确认,并重新编译工程,就会产生一个Release目录,其中包含了LookPY.exe文件,这个文件才能分发给别人使用。而DEBUG目录中的exe文件必须用到MFC42D.DLL文件,如果机器没有装VC,是没办法运行的。
2008-02-06 02:01 | 冰冻热狗

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

尊敬的老师VC的Release文件我做上了,你能否知道一个什么也不会的人.把想要会的东西学会了的高兴心情是什么样的吗,除夕夜我了坏了.这个幸福是你给我的.因此再一次感谢老师!
我感到VC该学的东西太多了.
我还想向你请教:你发表的主要函数代码:每一行前面的代码和代码后面的竖线以及符号怎么加上的?谢谢.
2008-02-07 17:08 | 汤光大

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

大家互相学习啦,慢慢积累就会知道越多的了。
可以收缩的竖线是网站提供的功能,你粘贴代码进入会自动产生的;另外,VC6本身不支持这个功能,Visual Studio 2003以上的版本支持这个功能,有空体验一下吧。
2008-02-08 00:08 | 冰冻热狗

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

能否传份源代码给我,多谢,miracle@163.com
2008-08-20 10:53 | miracle

# re: 用VC++6.0编程实现汉字拼音查找[未登录]  回复  更多评论   

您好老师,我按照您的方法编写完程序后,在列表框中显示的是“??”而不是拼音和汉字,请问这是什么原因呢?我用的资源表是windows自带的那个字符表。
2009-04-08 17:49 | 波波

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

能否发一分源代码给我作参考。
谢谢!yuancan@139.com
2009-12-11 11:55 | yuancan318

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

能否把源码发一份呢,谢谢
xuanwu1015@163.com
2010-02-25 23:10 | xv

# re: 用VC++6.0编程实现汉字拼音查找[未登录]  回复  更多评论   

好几年前的帖子了,不知道楼主还经常上blog否,能把源码发一份给我么,谢谢,我找了一个码表,里面有太多的if判断了,效率不好,查表法效率应该会高点
wgy516@163.com
谢谢
2010-03-23 18:14 | wgy

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

楼主 可以把源代码发一份给我吗?
jlkim_007@163.com
2011-05-21 13:17 | jlkim

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

最近,在编vc,连数据库时,想按拼音查找,不知道怎样弄,能否把这个例子的代码,发到邮箱,参考一下,谢谢啊 hbjzjllxh@163.com
2011-05-27 17:31 | lixiaohong

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

楼主你好,能把源码程序给我发一份,学习学习吗?谢谢了!!azhanjun_66@126.com,不胜感激!
2011-06-28 20:42 | 梦在远方

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

楼主你好,发一份源码行吗,找了很多,觉得都不太好用,mch312@163.com
2011-08-12 18:09 | mch312

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

楼主,给分源代码好吗,我找了很久
2011-10-04 10:38 |

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

请教:我想用自己编的字库:里面有汉字,数字,字母的代码,我最后想找出并保存的是他们的代码,怎么做到?
2011-11-09 11:16 | yanghs

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

我的QQ:382249167,麻烦了
2011-11-09 11:17 | yanghs

# re: 用VC++6.0编程实现汉字拼音查找  回复  更多评论   

楼主你好,能把源码程序给我发一份学习学习吗?谢谢了!!1422461141@qq.com,不胜感激!
2013-11-04 17:24 | 冯博博

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理