2021-08-29 10:17:13
Re②:テキストファイルをUT8のみで処理する方法
こんな感じのはずなんですが、OSとFEP(IME)の都合上、うちでは動作しないので動作確認できませんでした。 使用しているAPIが古いもの(Vista以前の標準)であるため、新しいIMEでは対応していない場合があります。 新しいOS(Vista以降?)の標準で付いてくるIMEは対応しません。が、ATOK等サードパーティ製のIMEの多くは対応しているようです。 ※なでしこv1で「漢字読み取得」で結果が得られていれば、対応しているIMEです。同じAPIを使用しています。 動作未確認ですが参考までに。 --------------- !変数宣言は必要 ●漢字読取得U({文字列}Aの) lとは整数 cとは整数 oとは整数 SAとは整数 USとは整数 結果とは整数 変換後とは空 hwndとは整数 hklとは整数 himcとは整数 hwndは母艦のハンドル hklはGetKeyboardLayout(0) himcはImmGetContext(hwnd) SAはPOINTER(A)からUTF82UNI変換 SAはSA & "{\0}{\0}" // GCL_REVERSECONVERSION=2 結果=ImmGetConversionListW(hkl,himc,POINTER(SA),0,0,2) もし、結果>0ならば、 l=結果 Sとは文字列 Sにlを確保 // GCL_REVERSECONVERSION=2 結果=ImmGetConversionListW(hkl,himc,POINTER(SA),POINTER(S),l,2) もし、結果>0ならば、 // dwCountを読んで結果の数を調べる c=Sの9を`DWORD`でバイナリ取得 もし、c>0ならば、 // dwOffset[]からn番目の結果を取得する。ただし、0は元で1以降が結果 // index=1(最初の結果)を取得する o=Sの29を`DWORD`でバイナリ取得 USはPOINTER(S)+o lはlstrlenW(US) 変換後はUSからlをUNI2UTF8変換 違えば、 ImmReleaseContext(hwnd,himc) 「IMMコンテキストの取得に失敗しました({GetLastError()})」でエラー発生 ImmReleaseContext(hwnd,himc) それは変換後 // nul文字で終わるUnicode文字列へのポインタをUTF8文字列に変換します // 引数の型は、文字列ではなく文字列へのポインタ(整数)なので注意。 // 結果には常にnull文字は付かないので注意 ●UNI2UTF8変換({整数}Pから{整数=-1}CNTを) 結果とは整数 lとは整数 結果=WideCharToMultiByte(65001,0,P,CNT,0,0,0,0) もし、結果>0ならば、 l=結果 Sとは文字列 Sにlを確保 結果=WideCharToMultiByte(65001,0,P,CNT,POINTER(S),l,0,0) もし、結果>0ならば、 もし、CNT=-1ならば、 それはSを1バイト右端削除 違えば、 それはS 違えば、 それは`` 違えば、 それは`` // nul文字で終わるUTF8文字列へのポインタをUNICDE文字列に変換します // 引数の型は、文字列ではなく文字列へのポインタ(整数)なので注意。 // 結果には常にnull文字は付かないので注意 ●UTF82UNI変換({整数}Pから{整数=-1}CNTを) 結果とは整数 lとは整数 結果=MultiByteToWideChar(65001,0,P,CNT,0,0) もし、結果>0ならば、 l=結果 Sとは文字列 Sに(l*2)を確保 結果=MultiByteToWideChar(65001,0,P,CNT,POINTER(S),l) もし、結果>0ならば、 もし、CNT=-1ならば、 それはSを2バイト右端削除 違えば、 それはS 違えば、 それは`` 違えば、 それは`` ●ImmCreateContext()=DLL("imm32.dll", "DWORD ImmCreateContext( )") ●ImmDestroyContext(hImc)=DLL("imm32.dll", "DWORD ImmDestroyContext( HIMC hImc )") ●ImmGetContext(hWnd)=DLL("imm32.dll", "DWORD ImmGetContext( HWND hWnd )") ●ImmReleaseContext(hWnd,hImc)=DLL("imm32.dll", "DWORD ImmReleaseContext( HWND hWnd, HIMC hImc )") ●ImmGetConversionListW(hKl,hImc,lpSrc,lpDst,dwBufLen,uFlag)=DLL("imm32.dll", "DWORD ImmGetConversionListW( HKL hKl, HIMC hImc, LPCWSTR lpSrc, LPCANDIDATELIST lpDst, DWORD dwBufLen, UINT uFlag )") ●GetKeyboardLayout(idThread)=DLL("user32.dll", "DWORD GetKeyboardLayout( DWORD idThread )") ●WideCharToMultiByte(CodePage,dwFlags,lpWideCharStr,cchWideChar,lpMultiByteStr,cchMultiByte,lpDefaultChar,lpUUsedDefaultChar)=DLL("kernel32.dll", "DWORD WideCharToMultiByte( UINT CodePage, // コードページ DWORD dwFlags, // 処理速度とマッピング方法を決定するフラグ LPCWSTR lpWideCharStr, // ワイド文字列のアドレス int cchWideChar, // ワイド文字列の文字数 LPSTR lpMultiByteStr, // 新しい文字列を受け取るバッファのアドレス int cchMultiByte, // 新しい文字列を受け取るバッファのサイズ LPCSTR lpDefaultChar, // マップできない文字の既定値のアドレス LPBOOL lpUsedDefaultChar // 既定の文字を使ったときにセットするフラグのアドレス )") ●MultiByteToWideChar(CodePage,dwFlags,lpMultiByteStr,cchMultiByte,lpWideCharStr,cchWideChar)=DLL("kernel32.dll", "DWORD MultiByteToWideChar( UINT CodePage, // コードページ DWORD dwFlags, // 処理速度とマッピング方法を決定するフラグ LPSTR lpMultiByteStr, // 新しい文字列を受け取るバッファのアドレス int cchMultiByte, // 新しい文字列を受け取るバッファのサイズ LPCWSTR lpWideCharStr, // ワイド文字列のアドレス int cchWideChar // ワイド文字列の文字数 )") ●GetLastError()=DLL("kernel32.dll", "DWORD GetLastError()") ●lstrlenW(p)=DLL("kernel32.dll", "DWORD lstrlenW( LPCWSTR p )") ■CANDIDATELIST ・dwSize // DWORD ・dwStyle // DWORD ・dwCount // DWORD ・dwSelection // DWORD ・dwPageStart // DWORD ・dwPageSize // DWORD ・dwOffset0 // DWORD ----- |