- PR -

[C#]文字入力が完了している漢字の読みを認識する方法は?

投稿者投稿内容
Terol
会議室デビュー日: 2005/11/04
投稿数: 15
投稿日時: 2005-12-19 17:56
目が不自由な人の為のホームページリーダーをプログラム練習の一環として作ろうと思うのですが、ホームページですでに入力された漢字の読みをかな文字として認識する手段で行き詰っています。やはりすべての漢字の読みをデータベース化することが望ましいのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-20 02:01
引用:

Terolさんの書き込み (2005-12-19 17:56) より:

ホームページですでに入力された漢字の読みをかな文字として認識する手段で行き詰っています。


既にある内容となると、Excel VBA から SetPhonetic を利用する方法くらいしか思いつきませんね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-12-20 07:14
引用:

Terolさんの書き込み (2005-12-19 17:56) より:
目が不自由な人の為のホームページリーダーをプログラム練習の一環として作ろうと思うのですが、ホームページですでに入力された漢字の読みをかな文字として認識する手段で行き詰っています。やはりすべての漢字の読みをデータベース化することが望ましいのでしょうか?


入力している時に認識するならともかく、入力完了してから認識するには全ての読みをデータベースに持つ以外に無いでしょうね。WBページを閲覧するのに、入力してもらった項目だけを読み上げてもらっても意味ありませんし、全ての読みをデータベース化するのが正しいアプローチだと思います。
rvmx
大ベテラン
会議室デビュー日: 2002/09/26
投稿数: 184
お住まい・勤務地: 愛媛県
投稿日時: 2005-12-20 07:15
今日は

もし読み上げるのが目的であればMsagent等が使えると思います。
なか-chan@最愛のiMac
ぬし
会議室デビュー日: 2002/07/17
投稿数: 385
お住まい・勤務地: 和光市・世田谷区
投稿日時: 2005-12-20 09:06
Terolさん

> 漢字の読みをかな文字として認識する手段

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=11535&forum=7&start=0

こちらでしょうか?
Terol
会議室デビュー日: 2005/11/04
投稿数: 15
投稿日時: 2005-12-31 16:16
データベースを作成し開発をがんばっていたのですが、「なか-chan」さんに教えていただいた「漢字の読みをかな文字として認識する手段」の情報にてデータベースを必要としないホームページリーダをなんとか作成することができました。
「じゃんぬねっと」さん、「甕星」さん、「rvmx」さん、「なか-chan」さん。
丁寧な返答ありがとうございました。
Terol
会議室デビュー日: 2005/11/04
投稿数: 15
投稿日時: 2006-02-06 04:28
解決したと思っていた問題なのですが、ImmGetConversionListを主体に作成しているGetReverseConversion関数について聞きたいことがあり書き込みます。

<「Jubei」さんのプログラムを参照>

public string[] GetReverseConversion(string AText)
{
IntPtr hIMC = ImmGetContext(this.Handle);
IntPtr hKL = GetKeyboardLayout(0);
CANDIDATELIST list = new CANDIDATELIST();
int dwSize = ImmGetConversionList(hKL,hIMC,AText,IntPtr.Zero,0,GCL_REVERSECONVERSION);
IntPtr BufList = Marshal.AllocHGlobal(dwSize);
ImmGetConversionList(hKL,hIMC,AText,BufList,dwSize,GCL_REVERSECONVERSION);
Marshal.PtrToStructure(BufList,list);
byte[] buf = new byte[dwSize];
Marshal.Copy(BufList,buf,0,dwSize);
Marshal.FreeHGlobal(BufList);
string[] strList=null;
if (list.dwCount > 0)
{
int os = list.dwOffset;
string str = System.Text.Encoding.Default.GetString(buf,os,buf.Length-os);
char[] par = "\0".ToCharArray();
string[] temp = str.Split(par);
strList = new string[list.dwCount];
Array.Copy(temp,strList,list.dwCount);
}
ImmReleaseContext(this.Handle,hIMC);
return strList;
}

上記のGetReverseConversion関数に文字列「明日は昼から雨」を渡すと
strList[0]=あしたはひるからあめ、  strList[1]=あすはひるからあめ
strList[2]=みょうにちはひるからあめ、strList[3]=あすはひるからあめ
strList[4]=あしたはひるからあめ、  strList[5]=あしたはひるからあめ
といった具合にstrListの配列が返ってくるのですが、長い文字列を渡した時に候補数が多くなりすぎるのか、エラーが発生してしまいます。
ホームページリーダーを作成している私としては、精度の高いstrList[0]の文字列だけを返してもらえば満足なので他の候補は要らないのですが、この関数のどこを変更させれば都合よく動作するのか分からないため、
長い文字列を小分けに渡しstrListからstrList[0]だけを選択し取得するという、お粗末な方法をしているのが現状です。
バッファサイズの負担を少なくするためにも、他の候補を考えずに必要な文字列(ここではstrList[0])だけを取り出すにはどうしたらよいのでしょうか?


[ メッセージ編集済み 編集者: Terol 編集日時 2006-02-06 06:24 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-02-06 13:48
MS-IMEの仕様です。
元々ImmGetConversionListはIMEの再変換用の関数ですので、実装はIME次第です。
例えばATOK15では、「明日は昼から雨」の結果は0になったりします(複数文節の再変換をサポートしていない模様)。ついでにバッファが長くなる場合は自動的に候補を絞ったりもしてます。
変換元文字列を適切な長さ(というか文節)で区切るなどの工夫が必要でしょう。

スキルアップ/キャリアアップ(JOB@IT)