求助汉字转换成拼音的问题

李丽叁 2006-04-29 04:44:13
我在VC++下实现汉字到拼音的转换,但是写的程序在转换的时候拼音显示的是NULL,好象读不了字典。主要程序:
一、编程实现
1、 创建一个基于对话框的MFC应用程序。
2、 制作界面,如下图1所示:
3、 把汉字拼音对应表导入为资源,定义资源名字为“PYGBK”,自动生成资源ID为IDR_PYGBK1,这里需要注意的是在此资源的属性框中去掉“External file”的选择(缺省为选择),这样对应表才能真正导入到应用程序中,达到与外部文件的分离。
4、 为输入框定义一个CString类型的变量m_Edit1,为列表框定义一个CListBox类型的变量m_List1。

为查找按钮添加相应的关联函数,并在此函数中添加查找拼音的代码。具体算法为查找对应表中的所有汉字,如果找到就再查找其拼音并把与此汉字对应的所有拼音显示在列表框中。下图2为查找汉字串“蒹葭苍苍白露为霜”的结果。
5、主要函数代码:
1// 查找按钮对应的函数
2void CLookPYDlg::OnSearch()
3{
4 m_List1.DeleteAllItems();
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.InsertItem(0xffff,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}
希望指点下 谢谢!!!!!!!!!!!
...全文
383 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级大笨狼 2007-01-03
  • 打赏
  • 举报
回复
http://www.dullwolf.cn/

去下载汉字转换拼音程序,代码公开的,可以转换成任何程序语言,英文操作系统下好使.

qù xià zǎi hàn zì zhuǎn huàn pīn yīn chéng xù , dài mǎ gōng kāi de , kě yǐ zhuǎn huàn chéng rèn hé chéng xù yǔ yán , yīng wén

cāo zuò xì tǒng xià hǎo shǐ .

支持大部分多音字
zhī chí dà bù fēn duō yīn zì

很长 长远 长久
hěn cháng cháng yuǎn cháng jiǔ
生长 成长
shēng zhǎng chéng zhǎng

zhù fú suǒ yǒu xiōng di jiě mèi , xīn de yī nián , yǒu gèng duō shōu huò

祝福所有兄弟姐妹,新的一年,有更多收获


cún zài wèn tí : -------- hào hē jiǔ 。
存在问题:--------好喝酒。
fēn xī yuán yīn : -------- jiǔ hǎo hē 。
分析原因:--------酒好喝。
zǒng jié jīng yàn : -------- hē jiǔ hǎo 。
总结经验:--------喝酒好。
zhěng gǎi cuò shī : -------- jiǔ hē hǎo 。
整改措施:--------酒喝好。
nǔ lì fāng xiàng : -------- hē hǎo jiǔ 。
努力方向:--------喝好酒。
gudulyn 2006-06-06
  • 打赏
  • 举报
回复
MARK
dzq138 2006-06-06
  • 打赏
  • 举报
回复
印个脚印.
nkwesley 2006-06-06
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
using namespace std;

static char convert(wchar_t n);
static bool In(wchar_t start, wchar_t end, wchar_t code);

int main(int argc, char* argv[])
{
string sChinese = "我爱中国"; // 输入的字符串

char chr[3];
wchar_t wchr = 0;

char* buff = new char[sChinese.length()/2];
memset(buff, 0x00, sizeof(char)*sChinese.length()/2+1);

for (int i = 0, j = 0; i < (sChinese.length()/2); ++i)
{
memset(chr, 0x00, sizeof(chr));
chr[0] = sChinese[j++];
chr[1] = sChinese[j++];
chr[2] = '\0';

// 单个字符的编码 如:'我' = 0xced2
wchr = 0;
wchr = (chr[0] & 0xff) << 8;
wchr |= (chr[1] & 0xff);

buff[i] = convert(wchr);
}

cout << "pin yin = [" << buff << "]" << endl;

return 0;
}

char convert(wchar_t n)
{
if (In(0xB0A1,0xB0C4,n)) return 'a';
if (In(0XB0C5,0XB2C0,n)) return 'b';
if (In(0xB2C1,0xB4ED,n)) return 'c';
if (In(0xB4EE,0xB6E9,n)) return 'd';
if (In(0xB6EA,0xB7A1,n)) return 'e';
if (In(0xB7A2,0xB8c0,n)) return 'f';
if (In(0xB8C1,0xB9FD,n)) return 'g';
if (In(0xB9FE,0xBBF6,n)) return 'h';
if (In(0xBBF7,0xBFA5,n)) return 'j';
if (In(0xBFA6,0xC0AB,n)) return 'k';
if (In(0xC0AC,0xC2E7,n)) return 'l';
if (In(0xC2E8,0xC4C2,n)) return 'm';
if (In(0xC4C3,0xC5B5,n)) return 'n';
if (In(0xC5B6,0xC5BD,n)) return 'o';
if (In(0xC5BE,0xC6D9,n)) return 'p';
if (In(0xC6DA,0xC8BA,n)) return 'q';
if (In(0xC8BB,0xC8F5,n)) return 'r';
if (In(0xC8F6,0xCBF0,n)) return 's';
if (In(0xCBFA,0xCDD9,n)) return 't';
if (In(0xCDDA,0xCEF3,n)) return 'w';
if (In(0xCEF4,0xD188,n)) return 'x';
if (In(0xD1B9,0xD4D0,n)) return 'y';
if (In(0xD4D1,0xD7F9,n)) return 'z';
return '\0';
}

bool In(wchar_t start, wchar_t end, wchar_t code)
{
if (code >= start && code <= end)
{
return true;
}
return false;
}

thisisll 2006-04-29
  • 打赏
  • 举报
回复
http://www.xiaozhou.net/cooldog/blogview.asp?logID=116
http://community.csdn.net/Expert/topic/4723/4723985.xml?temp=.8103296
http://www.doyouhike.net/forum/comm_nav/325548,0,0,1.html 求助 如何使用 Google Earth 做一条线路图 放进GPS 以前看见有一个帖子,上面写着有一位仁兄在偷 Google Earth 的高程数据,做等高线地图,于是在 Baidu 这样搜索 “Google Earth site:www.doyouhike.net”,搜索磨房里面所有有关“Google Earth”的帖子,那个帖子没有找到,却发现了本帖子。由于自己有时候带队,还有就是喜欢琢磨 GPS,就自己生成 KML 格式的轨迹。在“Google Earth”里面找到自己要去的地方,通过别人的资料,看看看看大致的路线,然后取一些坐标点。取点的时候,把鼠标放在“Google Earth”上,然后按“Print Screen/SysRq”键来截屏,之后,粘贴在画图里面,之后,就录入这个点的经纬度,海拔一般情况下的价值不大,就省略了。之后,把这些点导入 WPS的电子表格,利用公式把“114,31,00.18”格式的经纬度转换为“114.516716”格式,就着就手工生成 KML文件了,最后,利用 gpsbabel-1.3.6 转换成我的 GPS 识别的格式。想省钱,就在 TAOBAO 买了一个二手杂牌的 GPS,Lowrance Hunt C,不支持中文,于是采用了英文菜单,地名只好采用拼音了。这样做起来实在累,一般生成一条比较短的轨迹,花两个小时是很正常的事情。前一阵子,在学习《WINDOWS 程序设计》,于是就想参照上面的例程写一个小程序,让它自动生成我需要的轨迹。 《WINDOWS 程序设计》的第八章的 WHATCLR 程序,它运行时候,就可以以点的方式改变其它程序的颜色,既然要改变这些点,就要知道它们相对于屏幕左上角的坐标。既然是这样,那利用相似三角形的原理,我在 “Google Earth”这样描点,知道起点和终点的坐标后,就很容易地生成一条所需要的 KML 格式的轨迹了。之后,把它导入“Google Earth”以检验这条轨迹,不合乎自己要求就重描一条,几分钟就搞定了。看来,“懒人推动社会进步”,这句话非常有道理。 其中一个问题就是,需要用按键或者鼠标来控制程序描点的开始和结束,于是参考了第六章的 KEYVIEW1 和 第七章的 BLOKOUT1,最后决定使用“a”(小写字母)座位控制键!本来想以鼠标右键来控制的,后来没有搞定,就放弃了。 最后碰到的一个令人头疼的问题就是保存文件,开始想参考第十一章的 POPPAD 程序,看来没有把这个程序吃透,就放弃了。准备使用《WINDOWS 核心编程》上面的文本框来输出生成的经纬度文件,当我安装号运行程序库并配置好,忽然发现它是 C++ 的程序,晕死了。期间还尝试过使用 C++ 的文件指针 FP,后来发现不支持!就放弃了,时间不允许我先去吃透 C++ 再来完成这个程序。后来,发现《WINDOWS 程序设计》的例程,包含的头文件是这种:#include ,而 C++ 格式包含的头文件是:#include ,通常没有“.h”,感觉《WINDOWS 程序设计》应该还支持 Turbo C 2.0 格式下的文件读写,于是找到谭浩强同志的《C 语言程序设计》,看看它怎么弄的。之后,在 VC++ 6.0下测试了一把,通过,于是程序就基本完工了。 程序的使用,把附件的压缩包解压缩的你的硬盘的任意一个角落,在 C 盘的根目录下生成一个文本文件“START.txt”,不知道怎么生成就问你的电脑启蒙老师了。压缩包里面有一个 START.txt,可以直接修改了!然后运行 WHATCLR.exe,按一下小写字母“a”,C 盘的根目录下就生成了 startstop.kml,(可能需要刷新一下),将其导入“Google Earth”,就会发现2个点,“start”和“stop”,点 WHATCLR.exe 让它在最前面,之后把鼠标放在 “start” 处,“start” 会变大,再按一下小写字母“a”,按住鼠标左键沿着路径拖动就开始生成轨迹,当鼠标拖到 “stop”点的时候,“stop”变大,松开鼠标,同时按一下小写字母“a”完成轨迹的生成。注意,生成轨迹的时候,必须让 WHATCLR.exe 始终处在各个窗口的最前面,也就是它获得焦点!这时,在 C 盘的根目录就会发现2个 KML 文件:“GPSDATA.KML”和“GPSDATA2.KML”,把“GPSDATA.KML”导入到“Google Earth”,看是否合乎你的要求,不合要求就重来一遍,直到合乎你的要求为止。用 gpsbabel-1.3.6 把转换为你的 GPS 所支持的格式即可。 注意:由于是习作,KML 文件保存的位置默认为 C 盘,如果想存储在其它地方,可以自行修改程序。 压缩包里附有源代码。如果想知道程序为什么这么写,请问 Bill·Gates 或者是 Charles·Petzold。如果想知道 KML 文件怎么生成,请联系 Google 或者 zGPSconv.exe 的作者,我是参照 zGPSconv.exe 生成的 KML 文件来生成 KML 文件的。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧