漢字から、かなに変換する方法がわかりません。
APIとかあるのでしょうか?
Win98のIMEから逆変換みたいなのがありますがそういうのを作りたいのです。
例 松田 → まつだ (カタカナになっても構いません)
どうぞよろしくお願いします。
ImmGetCompositionString
ですか?
kakasi.dllを使えば変換可能だけど、使用条件に注意。
http://kakasi.namazu.org/
https://www.petitmonte.com/bbs/answers?question_id=4163
ImmGetCompositionString
は、入力した文字のフリガナを取得する場合でしたね。
ImmGetCompositionStringはまだ試していません。
あるけど... 様、今実験しています。
後ほどご報告します。
私は、ImmGetConversionListを使いました。
編集 削除https://www.petitmonte.com/bbs/answers?question_id=4163
を参考に作成したのですが、デバックで
Result := kakasi_getopt_argv(Argc, @Argv);
を実行するとプログラムが終了してしまいます。
LoadLibrary('kakasi.dll')でハンドルが0じゃない事を確認しました。
環境変数にITAIJIDICTPATH、KANWADICTPATHも登録しました。
何か忘れている事があるのでしょうか?
もう少し力を貸してください。お願いします。
プログラムが終了してしまう原因は辞書ファイルが見つからないから。
例えば、c:\kakasi\share\kakasiフォルダにKakasi辞書がある場合、
ITAIJIDICTPATH=c:\kakasi\share\kakasi\itaijidict
KANWADICTPATH=c:\kakasi\share\kakasi\kanwadict
のように環境変数を設定。
※そのフォルダはデフォルトなので、
c:\kakasi\share\kakasiフォルダにKakasi辞書を入れておけば環境変数の
設定は不要になるけど。
j様
ImmGetConversionListはIME変換中時の事ですかねぇ?
今回は、textファイルの漢字文字をひらがなにしたいのです。
もちろん、本来欲しい文字とは異なる場合があると思いますが。でしょうが。
私的には例として
S := Convetfurigana('松田');
ShowMessage(S); -> 'まつだ'と表示
というのが希望なのです。
よろしくお願いします。
辞書不明様
ありがとうございます。
環境変数を設定しなおして再起動したら上手くいきました。
ありがとうございます。
一応解決しましたが、勉強の為、
もし、他にIME API関係でありましたらご教授ください。
特に返信が無い様なので解決済みとします。
皆様ありがとうございました。
もう解決済みとのことですが。。。
昔、漢字氏名にとりあえずのふりがなをふる必要があって、使ったプログラムを書いておきます。
フォームに、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に表示されます。
j様
ありがとうございます。これ、かっこいいですね。
二つを参考にしてプログラムしてみます。
ありがとうございました。