程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 利用IFELanguage分隔中文語句並對漢字加注拼音

利用IFELanguage分隔中文語句並對漢字加注拼音

編輯:關於C++

這篇文檔是講如何利用IFELanguage接口實現對中文語句的分隔,並對詞語和字加注拼音的方法。

首先感謝一下Zswang(伴水)兄弟,他的無私奉獻精神和對Windows的深入研究值得我們每一個人學習。每次找到好東東他總是給我一份,包括這個IFELanguage接口資料。最初的資料源自一個日本網站,源代碼是用VC8寫的,Zswang(伴水)將其改寫為一個適用於Delphi下的版本。原C++代碼經ccrun(老妖)略作修改,在BCB6下調試通過。原VC8的版本和BCB6還有Zswang(伴水)寫的Delphi例子代碼都一起打包並上傳到[常規代碼]區,有興趣的朋友可以下載了研究一下。

首先需要初始化OLE:

#include <ole2.h>

OleInitialize(NULL);

當然,記的在程序結束的時候清場:

CoUninitialize();

我們需一個C++下用的msime.h或Delphi下的msime.pas(感謝Zswang),這個文件裡包含了IFELanguage接口,IFECommon接口等聲明,還有一些常量和結構的聲明,幸虧已經有人替我們做了這部分工作。^_^你只需下載了使用就可以。

#include "msime.h"

// 定義IFELanguage接口的IID
static const IID IID_IFELanguage =
{
0x019f7152, 0xe6db, 0x11d0,
{ 0x83, 0xc3, 0x00, 0xc0, 0x4f, 0xdd, 0xb8, 0x2e }
};
// 指定使用的語言,我們的例子使用簡體中文,其他還有:
// MSIME.China
// MSIME.Japan
// MSIME.Taiwan
// MSIME.Taiwan.ImeBbo
LPCWSTR msime = L"MSIME.China";
CLSID clsid;
if(CLSIDFromString(const_cast<LPWSTR>(msime), &clsid) != S_OK)
return;
// 創建一個IFELanguage的COM實例,得到接口指針
IFELanguage *pIFELanguage;
if(CoCreateInstance(clsid, NULL, CLSCTX_SERVER,
IID_IFELanguage, (LPVOID*)&pIFELanguage) != S_OK)
return;
if(!pIFELanguage)
return;
// 打開
if(pIFELanguage->Open() != S_OK)
{
pIFELanguage->Release();
return;
}
//
DWORD dwCaps;
if(pIFELanguage->GetConversionModeCaps(&dwCaps) != S_OK)
// 本文轉自 C++Builder研究 - http://www.ccrun.com/article.asp?i=1028&d=r0j832
{
pIFELanguage->Close();
pIFELanguage->Release();
}
// 要解析的中文句子
WideString wstrInput = WideString("漢字加拼音演示 妖哥萬歲");
MORRSLT *pmorrslt;
// 通過GetJMorphResult方法為漢字加注拼音
if(pIFELanguage->GetJMorphResult(
FELANG_REQ_REV,
FELANG_CMODE_PINYIN |
FELANG_CMODE_NOINVISIBLECHAR,
wstrInput.Length(), wstrInput, NULL, &pmorrslt) != S_OK)
{
pIFELanguage->Close();
pIFELanguage->Release();
}
if(!pmorrslt)
{
pIFELanguage->Close();
pIFELanguage->Release();
}
// 將句子分隔成詞語並單獨加注拼音
WideString wstrOutput, wstrWord, wstrPinYin;
wstrOutput = WideString(pmorrslt->pwchOutput);
wstrOutput = wstrOutput.SubString(1, pmorrslt->cchOutput);
// pmorrslt->cWDD是分隔後單詞的個數(英文單詞一個字母算一個)
for(int i = 0; i < pmorrslt->cWDD; i++)
{
// 讀取每段的詞語或字
wstrWord = wstrInput.SubString(
pmorrslt->pWDD[i].wReadPos + 1,
pmorrslt->pWDD[i].cchRead);
// 讀取每段的拼音
wstrPinYin = wstrOutput.SubString(
pmorrslt->pWDD[i].wDispPos + 1,
pmorrslt->pWDD[i].cchDisp);
//
if(wstrPinYin.Length() > 0)
wstrWord = wstrWord + "(" + wstrPinYin + ")";
// 輸出結果,我這裡僅僅是輸出到一個Memo中,在你的應用中記的更改此處,否則編譯不過時你又有想法了。
Memo1->Lines->Add(wstrWord);
}
// 記的清場咯
CoTaskMemFree(pmorrslt);
pIFELanguage->Close();
pIFELanguage->Release();

附件中有一個IMEEngine類,原作者可能是個日本程序員。類裡僅僅實現了GetJMorphResult的封裝,大家可以根據自己的需要自己擴充一下。貌似可以取得漢字的筆畫,如果你完成了這部分功能,希望能將代碼給我一份: cbfans#163.com,謝謝。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved