请问一下,当在一个Edit中输入两个汉字后,如何才能取到这两个汉字的拼音呢? 
比如 小明  怎么才能自动得到 xiaoming呢? 怎么进行这个转换呢?

解决方案 »

  1.   

    应该先找一个有拼音,汉字对照的字库文件,然后。
    不过不知道那里有这种文件下载,你用google搜索一下
      

  2.   

    如果你只想得到XMBSTR CSysKnifeCtrl::Pingying(LPCTSTR sHanzhi) 
    {
    CString strResult;
    // TODO: Add your dispatch handler code here
    INT    cFirst;
    INT    cSecond; if((sHanzhi[0]&0x00ff)>0xa0)
    {
        cFirst=(sHanzhi[0]-0xa0)&0x7f;
        cSecond=(sHanzhi[1]-0xa0)&0x7f; if(cFirst==16&&cSecond<=36)
          strResult="A";
        if((cFirst==16&&cSecond>36)||(cFirst==17)||(cFirst==18&&cSecond<=32))
          strResult="B";
        if((cFirst==18&&cSecond>32)||(cFirst==19)||(cFirst==20&&cSecond<=77))
          strResult="C";
        if((cFirst==20&&cSecond>77)||(cFirst==21)||(cFirst==22&&cSecond<=73))
          strResult="D";
        if((cFirst==22&&cSecond>73)||(cFirst==23&&cSecond==1))
          strResult="E";
        if((cFirst==23&&cSecond>1)||(cFirst==24&&cSecond<=32))
          strResult="F";
        if((cFirst==24&&cSecond>32)||(cFirst==25&&cSecond<=93))
          strResult="G";
        if((cFirst==25&&cSecond==94)||(cFirst==26)||(cFirst==27&&cSecond<=86))
          strResult="H";
        if((cFirst==27&&cSecond>86)||(cFirst==28)||(cFirst==29)||(cFirst==30)||(cFirst==31&&cSecond<=5))
          strResult="J";
        if((cFirst==31&&cSecond>5)||(cFirst==32&&cSecond<=11))
          strResult="K";
        if((cFirst==32&&cSecond>11)||(cFirst==33)||(cFirst==34&&cSecond<=71))
          strResult="L";
        if((cFirst==34&&cSecond>71)||(cFirst==35)||(cFirst==36&&cSecond<=34))
          strResult="M";
        if((cFirst==36&&cSecond>34)||(cFirst==37&&cSecond<=21))
          strResult="N";
        if((cFirst==37&&cSecond>21&&cSecond<=29))
          strResult="O";
        if((cFirst==37&&cSecond>29)||(cFirst==38&&cSecond<=57))
          strResult="P";
        if((cFirst==38&&cSecond>57)||(cFirst==39)||(cFirst==40&&cSecond<=26))
          strResult="Q";
        if(cFirst==40&&cSecond>26&&cSecond<=85)
          strResult="R";
        if((cFirst==40&&cSecond>85)||(cFirst==41)||(cFirst==42)||(cFirst==43&&cSecond<=89))
          strResult="S";
        if((cFirst==43&&cSecond>89)||(cFirst==44)||(cFirst==45&&cSecond<=57))
          strResult="T";
        if((cFirst==45&&cSecond>57)||(cFirst==46&&cSecond<=83))
          strResult="W";
        if((cFirst==46&&cSecond>83)||(cFirst==47)||(cFirst==48)||(cFirst==49&&cSecond<=24))
          strResult="X";
        if((cFirst==49&&cSecond>24)||(cFirst==50)||(cFirst==51)||(cFirst==52&&cSecond<=48))
          strResult="Y";
        if((cFirst==52&&cSecond>48)||(cFirst==53)||(cFirst==54)||(cFirst==55&&cSecond<=89))
          strResult="Z";
        if(cFirst<16||cFirst>55)
          strResult="*";
    }
    else
    {
    strResult="*";
    }
    return strResult.AllocSysString();
    }
      

  3.   

    经典,跟我想的一样,以前我也曾看过类似的文章。说的思想跟楼主一样。其思想也是根据汉字在UNICODE中的特点来进行划分
      

  4.   

    我以前问过这个问题,有位老大告诉我使用ImmGetConversionList这个函数,确实可以这段代码忘了从那里摘的了,有些东西没搞懂int HanziToPinyin(const char* strIn, char* bufOut, int nLen)
    {
      HKL hkl[100];
      char buf[255];
      LRESULT iMaxKey;  // 获得本机安装的输入法列表
      int n = GetKeyboardLayoutList(100, hkl);  // array of input locale identifiers  for(int ii = 0; ii < n; ii++)
      {
        // 获得输入法的名字
        if(ImmEscape(hkl[ii], 0, IME_ESC_IME_NAME, buf) <= 0) continue;    iMaxKey = ImmEscape(hkl[ii], 0, IME_ESC_MAX_KEY, NULL); 
        if(iMaxKey <= 0) continue;     // 看看这个输入法是否支持Reverse Conversion功能,
         // 同时侦测需要多大的空间容纳取得的信息 
         DWORD dwGCL = ImmGetConversionList(hkl[ii], 0, strIn, 
                                            NULL, 0,   GCL_REVERSECONVERSION); 
         if(dwGCL <= 0) continue; // 该输入法不支持Reverse Conversion功能       // 取得组字字根信息, dwGCL的值必须用上次调用
          // ImmGetConversionList得到的返回值作为参数 
          dwGCL += sizeof(CANDIDATELIST);
          dwGCL = ImmGetConversionList(hkl[ii], 0, strIn, 
                                  (CANDIDATELIST*)buf, dwGCL, GCL_REVERSECONVERSION); 
          if(dwGCL > 0) break;
        }
        
        if(ii == n) return 0;
        if(nLen < iMaxKey + 2) return -(iMaxKey * 2);    int nOff = buf[24];
        for(int j = nOff; j < nOff + iMaxKey * 2; j++) 
        {
           bufOut[j - nOff] = buf[j];
        }    return iMaxKey * 2;
    }int main(int argc, char* argv[])
    {
     char buf[100];
     memset(buf, 0, 100);
     HanziToPinyin("小明", buf, 100);
     printf("%s\n", buf);
     return 0;
    }输出:
    xiao3    ming2好像要求必须安装微软拼音输入法,另外输出的3,2我也不知道是什么意思
      

  5.   

    To:blackblue(跌跌撞撞) 
    3、2 代表声调分别是三声和二声。