zoukankan      html  css  js  c++  java
  • C#将中文词组处理成拼音

    using System.Runtime.InteropServices;
    
    using System.Runtime.CompilerServices;
    
     
    
    [DllImport("ole32.dll")]
    
    public static extern int CLSIDFromString(
    
        [MarshalAs(UnmanagedType.LPWStr)] string lpsz,
    
        out Guid clsid);
    
     
    
    [DllImport("ole32.dll")]
    
    public static extern int CoCreateInstance(
    
        [In, MarshalAs(UnmanagedType.LPStruct)] Guid clsid,
    
        IntPtr pUnkOuter, uint dwClsContext,
    
        [In, MarshalAs(UnmanagedType.LPStruct)] Guid iid,
    
        out IntPtr pv);
    
     
    
    [DllImport("ole32.dll", CallingConvention = CallingConvention.StdCall)]
    
    public static extern int CoInitialize(IntPtr pvReserved);
    
     
    
    public const int FELANG_REQ_REV = 0x00030000;
    
    public const int FELANG_CMODE_PINYIN = 0x00000100;
    
    public const int FELANG_CMODE_NOINVISIBLECHAR = 0x40000000;0
    
     
    
    [ComImport]
    
    [Guid("019F7152-E6DB-11D0-83C3-00C04FDDB82E")]
    
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    
    public interface IFELanguage
    
    {
    
        [MethodImpl(MethodImplOptions.InternalCall,
    
            MethodCodeType = MethodCodeType.Runtime)]
    
        int Open();
    
        [MethodImpl(MethodImplOptions.InternalCall,
    
            MethodCodeType = MethodCodeType.Runtime)]
    
        int Close();
    
        [MethodImpl(MethodImplOptions.InternalCall,
    
            MethodCodeType = MethodCodeType.Runtime)]
    
        int GetJMorphResult(
    
          [In] uint dwRequest,
    
          [In] uint dwCMode,
    
          [In] int cwchInput,
    
          [In, MarshalAs(UnmanagedType.LPWStr)] string pwchInput,
    
          [In] IntPtr pfCInfo,
    
          [Out] out IntPtr ppResult
    
        );
    
    }
    
     
    
    public const int CLSCTX_INPROC_SERVER = 1;
    
    public const int CLSCTX_INPROC_HANDLER = 2;
    
    public const int CLSCTX_LOCAL_SERVER = 4;
    
    public const int CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER;
    
     
    
    [DllImport("kernel32.dll")]
    
    public static extern int FormatMessage(int dwFlags, IntPtr lpSource,
    
        int dwMessageId, int dwLanguageId,
    
        StringBuilder lpBuffer, int nSize, IntPtr va_list_arguments);
    
    public const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x200;
    
    public const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000;
    
    public const int FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x2000;
    
     
    
    [DllImport("kernel32.dll")]
    
    public static extern int GetLastError();
    
     
    
    [DllImport("ole32.dll")]
    
    public static extern void CoTaskMemFree(IntPtr ptr);
    
     
    
    public const int S_OK = 0x00000000;
    
     
    
    public static string GetMessage(int errorCode)
    
    {
    
        StringBuilder lpBuffer = new StringBuilder(0x200);
    
        if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM |
    
            FORMAT_MESSAGE_ARGUMENT_ARRAY,
    
            IntPtr.Zero, errorCode, 0, lpBuffer, lpBuffer.Capacity, IntPtr.Zero) != 0)
    
        {
    
            return lpBuffer.ToString();
    
        }
    
        return "Unknown";
    
    }
    
     
    
    private bool coInitialized = false;
    
    private void button1_Click(object sender, EventArgs e)
    
    {
    
        if (!coInitialized)
    
        {
    
            CoInitialize(IntPtr.Zero);
    
            coInitialized = true;
    
        }
    
     
    
        textBox2.Clear();
    
        Guid vGuidIme;
    
        int vError;
    
        vError = CLSIDFromString("MSIME.China", out vGuidIme);
    
        if (vError != S_OK)      
    
        {
    
            MessageBox.Show(GetMessage(vError));
    
            return;
    
        }
    
        Guid vGuidLanguage = new Guid("019F7152-E6DB-11D0-83C3-00C04FDDB82E");
    
        IntPtr vPPV;                  
    
        vError = CoCreateInstance(vGuidIme, IntPtr.Zero, CLSCTX_SERVER,
    
            vGuidLanguage, out vPPV);
    
        if (vError != S_OK)
    
        {
    
            MessageBox.Show(GetMessage(vError));
    
            return;
    
        }
    
        IFELanguage vLanguage =
    
            Marshal.GetTypedObjectForIUnknown(vPPV, typeof(IFELanguage)) as IFELanguage;
    
        vError = vLanguage.Open();
    
        if (vError != S_OK)
    
        {
    
            MessageBox.Show(GetMessage(vError));
    
            return;
    
        }
    
        IntPtr vMorrslt;
    
        string vInput = textBox1.Text;
    
        vError = vLanguage.GetJMorphResult(FELANG_REQ_REV,
    
            FELANG_CMODE_PINYIN | FELANG_CMODE_NOINVISIBLECHAR,
    
            vInput.Length, vInput, IntPtr.Zero, out vMorrslt);
    
        if (vError != S_OK)
    
        {
    
            MessageBox.Show(GetMessage(vError));
    
            return;
    
        }
    
        string vPinYin = Marshal.PtrToStringUni(Marshal.ReadIntPtr(vMorrslt, 4),
    
            Marshal.ReadInt16(vMorrslt, 8));
    
        textBox2.AppendText("=" + vPinYin  + "\r\n");
    
        IntPtr vMonoRubyPos = Marshal.ReadIntPtr(vMorrslt, 28);
    
        IntPtr vReadIdxWDD = Marshal.ReadIntPtr(vMorrslt, 24);
    
        int iReadIdxWDD = 0;
    
        int iMonoRubyPos = Marshal.ReadInt16(vMonoRubyPos);
    
        vMonoRubyPos = (IntPtr)((int)vMonoRubyPos + 2);
    
        int i = 0;
    
        while (i < vInput.Length)
    
        {
    
            while (i < Marshal.ReadInt16(vReadIdxWDD))
    
            {
    
                i++;
    
                if (i >= Marshal.ReadInt16(vReadIdxWDD))            
    
                {
    
                    Console.WriteLine(Marshal.ReadInt16(vMonoRubyPos));
    
                    string s = vPinYin.Substring(iMonoRubyPos,
    
                          Marshal.ReadInt16(vMonoRubyPos) - iMonoRubyPos);
    
                    if (s != string.Empty)
    
                        s = vInput.Substring(iReadIdxWDD, i - iReadIdxWDD) + "(" + s + ")";
    
                    else s = vInput.Substring(iReadIdxWDD, i - iReadIdxWDD);
    
                    textBox2.AppendText(s + "\r\n");
    
                    iReadIdxWDD = i;
    
                    iMonoRubyPos = Marshal.ReadInt16(vMonoRubyPos);
    
                    break;
    
                }
    
                vMonoRubyPos = (IntPtr)((int)vMonoRubyPos + 2);
    
                vReadIdxWDD = (IntPtr)((int)vReadIdxWDD + 2);
    
            }
    
            vMonoRubyPos = (IntPtr)((int)vMonoRubyPos + 2);
    
            vReadIdxWDD = (IntPtr)((int)vReadIdxWDD + 2);
    
        }
    
        CoTaskMemFree(vMorrslt);
    
        vLanguage.Close();
    
    }

    转自 http://blog.sina.com.cn/s/blog_589d32f501000aya.html,不知道效果咋样,有人说会有指针漂移,俺也不懂,不知道是不是内存泄漏。过段时间要用,得看一下。

    另一个例子:

    string pinyin = PinYin.ToPinYin("哈哈 你好");
                Console.WriteLine(pinyin);

    https://files.cnblogs.com/igrl/%E6%B1%89%E5%AD%97%E8%BD%AC%E6%8B%BC%E9%9F%B3%E5%B8%A6%E5%A3%B0%E8%B0%83.rar

  • 相关阅读:
    关于运行SWT程序遇到的一个错误的总结
    Window7英文系统中出现的中文乱码的更改设置
    关于SWT中的表格(TableViewer类)
    关于SWT的容器类之----面板Composite类和Group类
    关于SWT中的Combo类和List类
    js怎么获取图片的相对地址
    .NET/MVC-ViewBag、ViewData、TempData区别
    Razor语法(五)
    Razor语法(四)
    Razor语法(三)
  • 原文地址:https://www.cnblogs.com/nanfei/p/2716785.html
Copyright © 2011-2022 走看看