本文說明如何使用 Microsoft IME 內建的 IFELanguage COM 介面,實現中文句子斷詞並為漢字標註拼音。原始資料源自日本網站,經 Delphi 版本移植至 C++Builder 6 驗證通過。
#include
#include "msime.h" // 包含 IFELanguage、IFECommon 介面定義
// 初始化 OLE
OleInitialize(NULL);
// 定義 IFELanguage IID
static const IID IID_IFELANGUAGE =
{0x019f7152, 0xe6db, 0x11d0, {0x83, 0xc3, 0x00, 0xc0, 0x4f, 0xdd, 0xb8, 0x2e}};
// 建立 COM 實例
LPCWSTR msime = L"MSIME.China"; // 簡體中文
CLSID clsid;
CLSIDFromString(const_cast(msime), &clsid);
IFELanguage *pIFELanguage;
CoCreateInstance(clsid, NULL, CLSCTX_SERVER, IID_IFELANGUAGE, (LPVOID*)&pIFELanguage);
pIFELanguage->Open();
// 取得轉換模式能力
DWORD dwCaps;
pIFELanguage->GetConversionModeCaps(&dwCaps);
// 輸入句子
WideString wstrInput = L"漢字加拼音演示 妖哥萬歲";
MORRSLT *pmorrslt;
// 呼叫 GetJMorphResult 取得斷詞與拼音結果
pIFELanguage->GetJMorphResult(
FELANG_REQ_REV,
FELANG_CMODE_PINYIN | FELANG_CMODE_NOINVISIBLECHAR,
wstrInput.Length(), wstrInput, NULL, &pmorrslt);
// 解析結果
WideString wstrOutput = WideString(pmorrslt->pwchOutput).SubString(1, pmorrslt->cchOutput);
for (int i = 0; i < pmorrslt->cWDD; i++) {
// 取得詞語
WideString wstrWord = wstrInput.SubString(
pmorrslt->pWDD[i].wReadPos + 1, pmorrslt->pWDD[i].cchRead);
// 取得拼音
WideString wstrPinYin = wstrOutput.SubString(
pmorrslt->pWDD[i].wDispPos + 1, pmorrslt->pWDD[i].cchDisp);
if (wstrPinYin.Length() > 0)
wstrWord = wstrWord + L"(" + wstrPinYin + L")";
Memo1->Lines->Add(wstrWord); // 輸出結果
}
// 清理資源
CoTaskMemFree(pmorrslt);
pIFELanguage->Close();
pIFELanguage->Release();
CoUninitialize();
MORRSLT:形態分析結果結構,包含輸出字串與詞語陣列pWDD:詞語資訊陣列,每元素含 wReadPos(讀取位置)、cchRead(讀取長度)、wDispPos(顯示位置)、cchDisp(顯示長度)FELANG_CMODE_PINYIN:指定輸出拼音模式附件提供 IMEEngine 類別封裝 GetJMorphResult,開發者可擴展實現漢字筆畫查詢等功能。完整原始碼包含 VC8、BCB6、Delphi 三版本可供下載參考。