漢字からかなへの変換

解決


IME  2007-04-19 14:04:53  No: 25852  IP: 192.*.*.*

漢字から、かなに変換する方法がわかりません。
APIとかあるのでしょうか?
Win98のIMEから逆変換みたいなのがありますがそういうのを作りたいのです。
例  松田 → まつだ (カタカナになっても構いません)
どうぞよろしくお願いします。

編集 削除
igy  2007-04-19 15:04:57  No: 25853  IP: 192.*.*.*

ImmGetCompositionString
ですか?

編集 削除
あるけど...  2007-04-19 15:05:14  No: 25854  IP: 192.*.*.*

kakasi.dllを使えば変換可能だけど、使用条件に注意。
http://kakasi.namazu.org/
https://www.petitmonte.com/bbs/answers?question_id=4163

編集 削除
igy  2007-04-19 15:11:57  No: 25855  IP: 192.*.*.*

ImmGetCompositionString
は、入力した文字のフリガナを取得する場合でしたね。

編集 削除
IME  2007-04-19 15:41:05  No: 25856  IP: 192.*.*.*

ImmGetCompositionStringはまだ試していません。
あるけど... 様、今実験しています。
後ほどご報告します。

編集 削除
 2007-04-19 16:08:19  No: 25857  IP: 192.*.*.*

私は、ImmGetConversionListを使いました。

編集 削除
IME  2007-04-19 16:14:34  No: 25858  IP: 192.*.*.*

https://www.petitmonte.com/bbs/answers?question_id=4163
を参考に作成したのですが、デバックで
Result := kakasi_getopt_argv(Argc, @Argv);
を実行するとプログラムが終了してしまいます。
LoadLibrary('kakasi.dll')でハンドルが0じゃない事を確認しました。
環境変数にITAIJIDICTPATH、KANWADICTPATHも登録しました。
何か忘れている事があるのでしょうか?
もう少し力を貸してください。お願いします。

編集 削除
辞書不明  2007-04-19 16:22:13  No: 25859  IP: 192.*.*.*

プログラムが終了してしまう原因は辞書ファイルが見つからないから。
例えば、c:\kakasi\share\kakasiフォルダにKakasi辞書がある場合、
ITAIJIDICTPATH=c:\kakasi\share\kakasi\itaijidict
KANWADICTPATH=c:\kakasi\share\kakasi\kanwadict
のように環境変数を設定。
※そのフォルダはデフォルトなので、
c:\kakasi\share\kakasiフォルダにKakasi辞書を入れておけば環境変数の
設定は不要になるけど。

編集 削除
IME  2007-04-19 16:24:21  No: 25860  IP: 192.*.*.*

j様
ImmGetConversionListはIME変換中時の事ですかねぇ?
今回は、textファイルの漢字文字をひらがなにしたいのです。
もちろん、本来欲しい文字とは異なる場合があると思いますが。でしょうが。
私的には例として
 S := Convetfurigana('松田');
 ShowMessage(S);  -> 'まつだ'と表示
というのが希望なのです。
よろしくお願いします。

編集 削除
IME  2007-04-19 16:41:44  No: 25861  IP: 192.*.*.*

辞書不明様
ありがとうございます。
環境変数を設定しなおして再起動したら上手くいきました。
ありがとうございます。
一応解決しましたが、勉強の為、
もし、他にIME API関係でありましたらご教授ください。

編集 削除
IME  2007-04-19 17:11:21  No: 25862  IP: 192.*.*.*

特に返信が無い様なので解決済みとします。
皆様ありがとうございました。

編集 削除
j  2007-04-19 18:09:00  No: 25863  IP: 192.*.*.*

もう解決済みとのことですが。。。

昔、漢字氏名にとりあえずのふりがなをふる必要があって、使ったプログラムを書いておきます。

フォームに、ListBoxとEditとLabelを2つ貼って、こんなかんじで。。。

procedure TForm1.Button1Click(Sender: TObject);
var
  imc: HIMC;                            // 入力コンテキストのハンドル
  KeyBoardLayout: HKL;                  // キーボードレイアウト
  DataList: PCandidateList;             // CANDIDATELIST 構造体へのポインタ
  intSize: integer;                     // サイズ
  tmpPChar: PChar;
  offSet: DWORD;
  i, intIndex: Integer;
begin
  Edit1.SetFocus;
  Label3.Caption := '';
  Label5.Caption := '';
  ListBox1.Clear;

  
  // 指定されたウィンドウに関連付けられている入力コンテキストを取得します。
  imc := ImmGetContext(Application.Handle);
  try
    KeyBoardLayout := GetKeyboardLayout(0);

    // 変換結果を受け取るために必要なバッファサイズを取得します。
    intSize := ImmGetConversionList(
        KeyBoardLayout, imc, PChar(Edit1.Text), nil, 0, GCL_REVERSECONVERSION);

    // DataListに、intSize分のメモリを割り当てます。
    GetMem(DataList, intSize);

    try
      // Edit1.Textに入力された文字列を逆変換し、DataListに保存します。
      ImmGetConversionList(
          KeyBoardLayout, imc, PChar(Edit1.Text), DataList, intSize, GCL_REVERSECONVERSION);

      tmpPChar := PChar(DWORD(DataList) + DataList^.dwOffset[1]);

      // フリガナを表示します。  
      Label3.Caption := String(tmpPChar);

      offset := 0;

      // 変換候補数を表示します。
      Label5.Caption := IntToStr(DataList^.dwCount) + ' 件';

      for i := 0 to DataList^.dwCount - 1 do
      begin
        tmpPChar := PChar(DWORD(tmpPChar) + offset);
        intIndex := ListBox1.Items.Add(String(tmpPChar));
        offSet   := Length(ListBox1.Items[intIndex]) + 1;
      end;

    finally
      // メモリを解放します。
      FreeMem(DataList);
    end;
  finally
    // 入力コンテキストを解放し、コンテキスト内の関連メモリのロックを解除します。
    ImmReleaseContext(Application.Handle, imc);
  end;
end;


  これで、Editに漢字入力して、ボタンをクリックすると、変換候補数がLabelに、取得したふりがなが、Listboxに表示されます。

編集 削除
IME  2007-04-19 18:30:02  No: 25864  IP: 192.*.*.*

j様
ありがとうございます。これ、かっこいいですね。
二つを参考にしてプログラムしてみます。
ありがとうございました。

編集 削除