我在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}
希望指点下 谢谢!!!!!!!!!!!
一、编程实现
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}
希望指点下 谢谢!!!!!!!!!!!
http://community.csdn.net/Expert/topic/4723/4723985.xml?temp=.8103296
#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;
}
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ǎngzhù 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ǔ 。
努力方向:--------喝好酒。