ひらがな -> 漢字 に変換するには?

解決


shazbot  2009-05-04 16:46:49  No: 145890  IP: 192.*.*.*

入力されたローマ字ないしひらがなを、IMEで変換後の文章に置換する方法を探しています。

例:
きょうはあめです  ->  今日は雨です
kyouhaamedesu     ->  今日は雨です

誤変換でもかまいませんし、精度は問いません。漢字変換の方法を探しています。

よろしくお願いします。

編集 削除
オショウ  2009-05-04 22:28:20  No: 145891  IP: 192.*.*.*

回答ではありません・・・

http://vsug.jp/tabid/63/forumid/51/threadid/8461/scope/posts/Default.aspx
http://tsuge.astgate.biz/witchgarden/?C%23%20Tips%2FWitchPaper%A4%C7%BC%C2%C1%F5%A4%B7%A4%BFIME%C0%A9%B8%E6

あくまで、参考・・・

なかなか難しいようですが、できないわけではありません。

※  因みに、私は使ったことありません。

以上。

編集 削除
MI  2009-05-05 19:17:54  No: 145892  IP: 192.*.*.*

VB6ですがサンプルがありました。

み〜くんパパの仕事部屋 - IME
http://www.mitene.or.jp/~sugisita/vb6_ime.html

このページの、「IMEの変換候補の取得」というところにあります。

VB6で試したところ、「きょうはあめです」と入力すると下記のような候補が取得できました。

今日は雨です
今日はあめです
今日は飴です
京は雨です
    ・
    ・
    ・

編集 削除
shazbot  2009-05-07 20:19:45  No: 145893  IP: 192.*.*.*

ありがとうございました。こんなに沢山関連サイトがあったんですね、検索させてしまって申し訳ありません・・・
上記のサイト、大変参考になりました。ありがとうございます。
お詫びに、自分なりの回答を記しますね。

動作確認: VB.NET 2008 Express Edition
---------
Option Explicit On
Imports System.Runtime.InteropServices

Module Hiragana2Kanji

    Private Enum GCL_ENUM
        GCL_CONVERSION = &H1
        GCL_REVERSECONVERSION = &H2
        GCL_REVERSE_LENGTH = &H3
    End Enum

    <DllImport("Imm32.dll")> _
    Public Function ImmGetContext(ByVal hWnd As IntPtr) As IntPtr
    End Function

    <DllImport("Imm32.dll")> _
    Public Function ImmGetConversionList(ByVal hKL As IntPtr, ByVal hIMC As IntPtr, ByVal lpSrc As String, ByVal lpDst As IntPtr, ByVal dwBufLen As Integer, ByVal uFlag As Integer) As Integer
    End Function


    <DllImport("Imm32.dll")> _
    Public Function ImmReleaseContext(ByVal hWnd As IntPtr, ByVal hIMC As IntPtr) As Integer
    End Function

    <StructLayout(LayoutKind.Sequential)> _
    Private Class CANDIDATELIST
        Public dwSize As Integer
        Public dwStyle As Integer
        Public dwCount As Integer
        Public dwSelection As Integer
        Public dwPageStart As Integer
        Public dwPageSize As Integer
        Public dwOffset As Integer
    End Class


    Public Function GetStr2KanjiList(ByVal text As String, ByVal hIMC As IntPtr) As String()

        If text = "" Then Return ""

        Dim hKL As IntPtr = System.Windows.Forms.InputLanguage.CurrentInputLanguage.Handle
        Dim list As New CANDIDATELIST
        Dim dwSize As Integer = ImmGetConversionList(hKL, hIMC, text, IntPtr.Zero, 0, GCL_ENUM.GCL_CONVERSION)
        Dim BufList As IntPtr = Marshal.AllocHGlobal(dwSize)


        ImmGetConversionList(hKL, hIMC, text, BufList, dwSize, GCL_ENUM.GCL_CONVERSION)
        Marshal.PtrToStructure(BufList, list)


        Dim buf As Byte() = New Byte(dwSize - 1) {}


        Marshal.Copy(BufList, buf, 0, dwSize)
        Marshal.FreeHGlobal(BufList)

        Dim os As Integer = list.dwOffset
        Dim str As String = System.Text.Encoding.[Default].GetString(buf, os, buf.Length - os - 3)
        Dim par As Char() = vbNullChar.ToCharArray()

        Dim strList As String() = str.Split(par)


        Return strList

    End Function
End Module



Public Class Form1

    Dim hIMC As IntPtr

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        debug.writeline(GetStr2Kanji(TextBox1.Text, hIMC))

    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        hIMC = ImmGetContext(Me.Handle)
        ImmReleaseContext(Handle, hIMC)
    End Sub
End Class

----------
ImmReleaseContextとImmGetContextをGetStr2KanjiList内で宣言してしまうと、二度目以降の試行のときにエラーがでてしまいます。
知識不足故、それを回避するためにこういう形にしてみました。

編集 削除