Home > Tips > C/C++でMigemo検索のサンプル(migemo.dll+bregonig.dll)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | #define UNICODE #define _UNICODE #include <stdio.h> #include <tchar.h> #include <windows.h> typedef struct _migemo migemo; typedef migemo*(__stdcall*MIGEMO_OPEN)( const char * dict); typedef void (__stdcall*MIGEMO_CLOSE)(migemo* object); typedef unsigned char *(__stdcall*MIGEMO_QUERY)(migemo* object, const unsigned char * query); typedef void (__stdcall*MIGEMO_RELEASE)(migemo* object,unsigned char * string); typedef int (__stdcall*MIGEMO_LOAD)(migemo* obj, int dict_id, const char * dict_file); typedef int (__stdcall*MIGEMO_IS_ENABLE)(migemo* obj); MIGEMO_OPEN migemo_open; MIGEMO_CLOSE migemo_close; MIGEMO_QUERY migemo_query; MIGEMO_RELEASE migemo_release; MIGEMO_LOAD migemo_load; MIGEMO_IS_ENABLE migemo_is_enable; typedef struct bregexp{ const TCHAR * outp; const TCHAR * outendp; const int splitctr; const TCHAR ** splitp; INT_PTR rsv1; TCHAR * parap; TCHAR * paraendp; TCHAR * transtblp; TCHAR ** startp; TCHAR ** endp; int nparens; }BREGEXP; #define BREGEXP_MAX_ERROR_MESSAGE_LEN 80 typedef int (*BMATCH)( TCHAR * str, TCHAR * target, TCHAR * targetendp,BREGEXP** rxp, TCHAR * msg); typedef void (*BREGFREE)(BREGEXP* rx); BMATCH BMatch; BREGFREE BRegfree; int migemosearch(migemo* p){ const TCHAR * search=_T( "Ichiban" ); TCHAR target[]=_T( "昭和アホ草紙あかぬけ一番!" ); //migemo_query()へ渡す文字列をANSIに変換 int query_length=WideCharToMultiByte(CP_UTF8,0,search,-1,NULL,0,NULL,NULL); char * query=( char *)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,query_length); WideCharToMultiByte(CP_UTF8,0,search,-1,query,query_length,NULL,NULL); //日本語検索のための正規表現作成 unsigned char *regexA=migemo_query(p,( const unsigned char *)query); HeapFree(GetProcessHeap(),0,query); //作成した正規表現をUnicodeに変換 int regex_length=lstrlenA(( char *)regexA); wchar_t *regexW=( wchar_t *)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(regex_length+1)* sizeof ( wchar_t )); MultiByteToWideChar(CP_UTF8,0,( LPCSTR )regexA,-1,regexW,(regex_length+1)* sizeof ( wchar_t )); //migemo_query()関数で作成した正規表現を解放 migemo_release(p,regexA); DWORD written=0; { TCHAR buffer[1024]={}; wsprintf(buffer,_T( "search: %s\ntarget: %s\n" ),search,target); WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),buffer,lstrlen(buffer),&written,NULL); } if (regexW){ //必ずNULLで初期化すること BREGEXP* rxp=NULL; //エラーメッセージ TCHAR msg[BREGEXP_MAX_ERROR_MESSAGE_LEN]; TCHAR * pattern=( TCHAR *)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(regex_length+12)* sizeof ( wchar_t )); //検索パターン作成(i:大文字小文字を区別しない) wsprintf(pattern,_T( "m/%s/i" ),regexW); //検索 if (BMatch(pattern,target,target+lstrlen(target),&rxp,msg)==1){ //マッチ!! const TCHAR match_msg[]=_T( "ミ☆!!" ); WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),match_msg,lstrlen(match_msg),&written,NULL); } HeapFree(GetProcessHeap(),0,pattern); if (rxp){ //BMatch()で得た検索結果を解放 BRegfree(rxp); } } HeapFree(GetProcessHeap(),0,regexW); return 0; } int _tmain( int argc, TCHAR ** argv){ //Migemoオブジェクト migemo* pmigemo; //migemo.dll/bregonig.dll読み込み HMODULE hMigemo=LoadLibrary(_T( "migemo.dll" )); HMODULE hBregonig=LoadLibrary(_T( "bregonig.dll" )); if (hMigemo!=NULL){ //関数のアドレス取得 migemo_open=(MIGEMO_OPEN)GetProcAddress(hMigemo, "migemo_open" ); migemo_close=(MIGEMO_CLOSE)GetProcAddress(hMigemo, "migemo_close" ); migemo_query=(MIGEMO_QUERY)GetProcAddress(hMigemo, "migemo_query" ); migemo_release=(MIGEMO_RELEASE)GetProcAddress(hMigemo, "migemo_release" ); migemo_is_enable=(MIGEMO_IS_ENABLE)GetProcAddress(hMigemo, "migemo_is_enable" ); migemo_load=(MIGEMO_LOAD)GetProcAddress(hMigemo, "migemo_load" ); if (hBregonig!=NULL){ BMatch=(BMATCH)GetProcAddress(hBregonig, "BMatchW" ); BRegfree=(BREGFREE)GetProcAddress(hBregonig, "BRegfreeW" ); } if (migemo_open!=NULL&&BMatch!=NULL){ //Migemoオブジェクト作成(辞書"./dict/utf-8/migemo-dict"読み込み) pmigemo=migemo_open( "./dict/utf-8/" "migemo-dict" ); if (pmigemo==NULL||!migemo_is_enable(pmigemo)){ //オブジェクト作成失敗 migemo_close(pmigemo); pmigemo=NULL; } } if (pmigemo!=NULL){ //検索へ migemosearch(pmigemo); //Migemoオブジェクト破棄 migemo_close(pmigemo); } else { MessageBox(NULL,_T( "migemo/dict/bregonig読み込み失敗" ),NULL,MB_OK|MB_ICONEXCLAMATION|MB_ICONEXCLAMATION); } //migemo.dll/bregonig.dll解放 FreeLibrary(hMigemo); FreeLibrary(hBregonig); } return 0; } |