我在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.   

    http://www.xiaozhou.net/cooldog/blogview.asp?logID=116
    http://community.csdn.net/Expert/topic/4723/4723985.xml?temp=.8103296
      

  2.   

    #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;
    }
      

  3.   

    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ǎ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ǔ  。
    努力方向:--------喝好酒。