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

news/2024/7/7 1:25:53 标签: 编程, vc++, 输入法, windows, list, mfc

摘要   使用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 //  查找按钮对应的函数
 2 void  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*/

57 bool  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


http://www.niftyadmin.cn/n/1710836.html

相关文章

ios 图片加载内存尺寸_ios 对于超高分辨率(图片本身不大)的图片加载导致内存暴增的处理方法...

0f0a1d08e3a1b1e156dfc95ff62e32070.jpg上面的图片是一个分辨率很高的图片图片本身只有1M左右但是分辨率很大。5472*3648&#xff0c;如果连续九张加载到UIImageView的时候导致内存暴增甚至会导致app因为memory的问题闪退。如果直接使用SDwebImage加载的话&#xff0c;你会发现…

一些经典题型----数据结构与算法

1.找到链表倒数第k个节点 假设一共链表长度为 x&#xff0c; 倒数第k个节点就是正数第 x-k1个节点 所以&#xff0c;方法 在起点设置两个指针a&#xff0c;b当 a 走到第 k-1个节点时&#xff0c;b 开始走当 a 走完整个链表时&#xff0c;b 所处位置就是倒数第k个节点位置a&…

默认是什么_男左女右是什么意思 为什么我们会默认男左女右?

在我们的生活中&#xff0c;对于男女的位置似乎有一个大家都默认的规矩&#xff0c;那就是男左女右。这个默认的约定存在于生活的方方面面&#xff0c;比如&#xff0c;一般的公厕就是男左女右;男女照一些正式的合照&#xff0c;比如结婚照&#xff0c;就是男左女右;还有一些情…

在Visual Basic 6.0中MSFlexGrid控件与DataGrid控件有什么不同?

都是数据绑定控件&#xff0c;但是也有一定的区别&#xff0c;适合不同的应用场合&#xff1a; MSFlexGrid 控件: Microsoft FlexGrid (MSFlexGrid) 控件可以显示网格数据&#xff0c;也可以对其进行操作。它提供了高度灵活的网格排序、合并和格式设置功能&#xff0c;网格中可…

python 数据类型要点

1.dict 对于字典来说 它的底层是由 hash表实现的 大数据写成字典模式再遍历&#xff0c;会减小复杂度&#xff0c;优化算法 因为 字典遍历复杂度为O(1),列表为O(n)另 字典要求其 key值必须是不可变数据类型&#xff0c;如元组&#xff0c;整形&#xff0c;字符串型列表就不行再…

分布式运用——rsync远程同步

分布式运用——rsync远程同步 一、rsync的背景和原理1.rsync的功能2.rsync的应用场景3.使用rsync的基本命令4.scp与rsync的区别 二、配置rsync源服务器1.关闭防火墙2.建立/etc/rsyncd.conf 配置文件3.保证所有用户对源目录/var/www/html 都有读取权限4.启动 rsync 服务程序5.关…

在电脑上怎么做判断题打√或x_2018电脑知识期末考试

出题人&#xff1a;莫大神白注&#xff1a;闭卷考试请自觉作答&#xff0c;请勿在评论区留下答案一、填空题(1分1空共52分)1.当今机械硬盘写入方式分两种分别是______和______2.叠瓦硬盘的特征是______,缺点是______、______3.硬盘分为三种分别是&#xff0c;______、______和_…

android html转word保留样式_【转】WORD批量去除文本框保留文本

文本框一般以浮动的形式&#xff08;即文字环绕方式为四周环绕、紧密环绕、衬于文字上方等&#xff09;存在于文档中&#xff0c;选中文本框时可以看到在它的左侧有一个锚定标记&#xff0c;锚标总是在某一个段落的开头位置&#xff0c;表示浮动的文本框锁定于该段落&#xff0…