• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            edog

            冰凍熱狗
            數據加載中……

            用VC++6.0編程實現漢字拼音查找

            VC++6.0編程實現漢字拼音查找

            eDog[原創]

            摘要   使用VC++6.0編程查找漢字的拼音

            關鍵字   漢字,拼音,資源

            http://www.shnenglu.com/Files/edog/LookPY.rar

            一、             引言

            在讀書看報或者瀏覽網上文章時候,經常會看到一些比較生僻的漢字而不知道其讀音;或者有些漢字知道其寫法,可以使用五筆等筆劃輸入法輸入卻不能使用拼音輸入法輸入。本文將演示怎么使用VC++6.0編寫程序實現漢字的拼音的查找,對于多音字也可以把所有的拼音找出來。在網上看到生僻的漢字時,把漢字粘貼到本程序的輸入框,就可以查找出這些漢字的拼音;或者使用五筆等輸入法把漢字輸入到本程序查找其拼音??梢杂兄谧x者正確的使用漢語拼音。

             

            二、             基礎知識

            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// 查找按鈕對應的函數
             2void 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*/

            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}


             

            一、             小結

            本文從原理和編程實現方面簡單的介紹了漢字拼音查找的方法,并簡單演示了怎么使用應用程序的資源。實現的關鍵為建立一張漢字和拼音的對應表并導入到應用程序中以達到應用程序與外部文件的分離。本程序在Windows98/2000環境使用VC++6.0編譯通過。

            11.jpg

            posted on 2005-11-30 00:25 冰凍熱狗 閱讀(8906) 評論(28)  編輯 收藏 引用 所屬分類: 應用程序

            評論

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            太感動了...正尋找中。。。。。我是說呀,VC使用這么廣泛,怎么可能沒有VC的漢字轉拼音的代碼?


            樓主,感謝中。。。
            2006-03-01 21:28 | King

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            不過大哥怎么沒把源代碼一起上傳呀。。
            2006-03-01 21:33 | King

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            老大 我想跟你聯系下,討論下你的這個程序啊。你的程序運行不了,我已經修改了。但是現在的問題是讀字典的時候讀取的是null.
            2006-05-16 15:01 |

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            什么意思?不懂,留下郵件地址或者聯系我:comwell@126.com
            2006-05-21 22:23 | 冰凍熱狗

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            測試一下 "劃" 字 很多字是不對的,他的那張表不準
            2006-06-21 09:04 | 沒用的

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            “劃”-guo, hua, huai
            你用全拼輸入法,這三種拼音都可以打出“劃”字,
            很多字不對?還有那些字不對?請明示一下。
            2006-06-22 12:44 | 冰凍熱狗

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            2007-10-09 20:43 | 夫人法

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            我編寫的結果是:列表框中只顯示輸入的漢字沒有拼音,怎么解決
            2008-01-11 18:05 | 真想學

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            這個原因就太多了,不知道你程序是怎么寫的。就這樣一句話,就別人怎么跟你說?
            2008-01-12 00:00 | 冰凍熱狗

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            尊敬的老師:
            我按著你的教導,作了一個漢字拼音查找程序結果一直運行挺好,朋友非要給他用.我就把VC++的DEBUG中的目錄中的PookPY.exe文件壓縮后傳給了他,結果不能用.一運行就提示:找不到MFC42D.DLL文件,希望你能告訴我,怎么做,朋友才能用我的PookPY.exe文件.謝謝,祝你春節好.全家幸??鞓?
            2008-02-03 19:48 | 湯光大

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            這是VC的基本常識啦,重新編譯一個Release版本就可以了,DEBUG版本的不能給別人用的。
            2008-02-05 01:40 | 冰凍熱狗

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            很不好意思,我是剛學習VC的老頭,所以連VC的基本常識都沒有的,因為不會就得向老師求教.
            這也就是說“重新編譯一個Release版本就可以了”這個知識我根本就沒有接觸過,麻煩老師。把我當成一個“白丁”(采鳥都不夠)那個水平給我說說,怎么“編譯一個Release版本”最好從頭一步一步的給我講一遍(我用的VC++6.0),老翁這里有禮了,謝謝好心的老師,謝謝。
            2008-02-05 09:41 | 湯光大

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            我暈~~~看來兄臺還要加強一下基礎知識。

            打開LookPY的工程后,在VC的界面中選擇“Build”菜單下面的“Set Active Configuration”,出現一個對話框,選擇“Win32 - Release”那一項,按“OK”確認,并重新編譯工程,就會產生一個Release目錄,其中包含了LookPY.exe文件,這個文件才能分發給別人使用。而DEBUG目錄中的exe文件必須用到MFC42D.DLL文件,如果機器沒有裝VC,是沒辦法運行的。
            2008-02-06 02:01 | 冰凍熱狗

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            尊敬的老師VC的Release文件我做上了,你能否知道一個什么也不會的人.把想要會的東西學會了的高興心情是什么樣的嗎,除夕夜我了壞了.這個幸福是你給我的.因此再一次感謝老師!
            我感到VC該學的東西太多了.
            我還想向你請教:你發表的主要函數代碼:每一行前面的代碼和代碼后面的豎線以及符號怎么加上的?謝謝.
            2008-02-07 17:08 | 湯光大

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            大家互相學習啦,慢慢積累就會知道越多的了。
            可以收縮的豎線是網站提供的功能,你粘貼代碼進入會自動產生的;另外,VC6本身不支持這個功能,Visual Studio 2003以上的版本支持這個功能,有空體驗一下吧。
            2008-02-08 00:08 | 冰凍熱狗

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            能否傳份源代碼給我,多謝,miracle@163.com
            2008-08-20 10:53 | miracle

            # re: 用VC++6.0編程實現漢字拼音查找[未登錄]  回復  更多評論   

            您好老師,我按照您的方法編寫完程序后,在列表框中顯示的是“??”而不是拼音和漢字,請問這是什么原因呢?我用的資源表是windows自帶的那個字符表。
            2009-04-08 17:49 | 波波

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            能否發一分源代碼給我作參考。
            謝謝!yuancan@139.com
            2009-12-11 11:55 | yuancan318

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            能否把源碼發一份呢,謝謝
            xuanwu1015@163.com
            2010-02-25 23:10 | xv

            # re: 用VC++6.0編程實現漢字拼音查找[未登錄]  回復  更多評論   

            好幾年前的帖子了,不知道樓主還經常上blog否,能把源碼發一份給我么,謝謝,我找了一個碼表,里面有太多的if判斷了,效率不好,查表法效率應該會高點
            wgy516@163.com
            謝謝
            2010-03-23 18:14 | wgy

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            樓主 可以把源代碼發一份給我嗎?
            jlkim_007@163.com
            2011-05-21 13:17 | jlkim

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            最近,在編vc,連數據庫時,想按拼音查找,不知道怎樣弄,能否把這個例子的代碼,發到郵箱,參考一下,謝謝啊 hbjzjllxh@163.com
            2011-05-27 17:31 | lixiaohong

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            樓主你好,能把源碼程序給我發一份,學習學習嗎?謝謝了?。zhanjun_66@126.com,不勝感激!
            2011-06-28 20:42 | 夢在遠方

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            樓主你好,發一份源碼行嗎,找了很多,覺得都不太好用,mch312@163.com
            2011-08-12 18:09 | mch312

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            樓主,給分源代碼好嗎,我找了很久
            2011-10-04 10:38 |

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            請教:我想用自己編的字庫:里面有漢字,數字,字母的代碼,我最后想找出并保存的是他們的代碼,怎么做到?
            2011-11-09 11:16 | yanghs

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            我的QQ:382249167,麻煩了
            2011-11-09 11:17 | yanghs

            # re: 用VC++6.0編程實現漢字拼音查找  回復  更多評論   

            樓主你好,能把源碼程序給我發一份學習學習嗎?謝謝了?。?422461141@qq.com,不勝感激!
            2013-11-04 17:24 | 馮博博
            99久久精品午夜一区二区| 欧美一级久久久久久久大| 色婷婷综合久久久中文字幕 | 国产一区二区三区久久精品| 国产精品久久毛片完整版| 久久91这里精品国产2020| 一本色道久久88综合日韩精品| 无码国内精品久久人妻| 韩国三级中文字幕hd久久精品 | 人人狠狠综合久久亚洲婷婷| 久久久99精品成人片中文字幕| 亚洲国产精品无码久久98| 国产精品一区二区久久精品无码| 久久久久久免费视频| 91精品国产综合久久久久久| 欧美一区二区久久精品| 人人狠狠综合久久亚洲88| 中文字幕人妻色偷偷久久| 色婷婷噜噜久久国产精品12p| 国内精品久久久久影院日本| 久久综合色老色| 久久精品国产亚洲AV不卡| 91精品国产综合久久婷婷| 国产成人精品综合久久久久| 色综合合久久天天给综看| 精品人妻伦九区久久AAA片69| 久久精品www人人爽人人| 国产成人精品综合久久久久| 日日狠狠久久偷偷色综合0| 国产亚洲色婷婷久久99精品91| 精品久久一区二区三区| 精品无码久久久久久午夜| 精品久久久无码人妻中文字幕| 亚洲国产天堂久久久久久| 久久无码国产| 久久久久久精品成人免费图片| 精品久久综合1区2区3区激情| 国产福利电影一区二区三区,免费久久久久久久精| 久久精品国产亚洲AV蜜臀色欲| 精品国产乱码久久久久软件| 久久久久亚洲精品日久生情 |