日本語プログラミング言語なでしこの公式掲示板

なでしこ の 掲示板

トップ 新規 検索

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
-----


(編集パスワード送信)

子記事

親記事 (No.1115)
返信した記事(元) (No.1116)

この内容(No.1117)に返信

この内容(No.1117)をダウンロード

この内容(No.1117)のテキスト表示





www.eznavi.net