利用微软类库 Visual Studio International Pack 汉字转拼音首字母,完美解决多音字问题

来源:互联网 发布:网络公开课视频 编辑:程序博客网 时间:2024/04/29 01:59

首先,从微软官网下载安装包:http://www.microsoft.com/zh-cn/download/details.aspx?id=15251。下载后解压,安装CHSPinYinConv.msi,这个就是是汉字拼音组件。

安装完成后在VS里添加引用,分别引用:C:\Program Files()x86\Microsoft Visual Studio International Pack\Simplified Chinese Pin-Yin Conversion Library(拼音)下的相关DLL。

网上的一般示例是这样的:

        /// <summary>         /// 汉字转化为拼音首字母        /// </summary>         /// <param name="str">汉字</param>         /// <returns>首字母</returns>         public static string GetFirstPinyin(string str)        {            string r = string.Empty;            foreach (char obj in str)            {                try                {                    ChineseChar chineseChar = new ChineseChar(obj);                    string t = chineseChar.Pinyins[0].ToString();                    r += t.Substring(0, 1);                }                catch                {                    r += obj.ToString();                }            }            return r;        }

但是这个方法并没有解决多音字的问题,我将上述方法修改为如下:

        /// <summary>        /// 汉字转化为拼音首字母        /// </summary>        /// <param name="str">汉字</param>        /// <returns>首字母</returns>        public List<string> GetFirstPinyin(string InputTxt)        {            List<string> listStrFirst = new List<string>();            List<string> listStrSecond = new List<string>();            List<string> listStr = new List<string>();            foreach (char obj in InputTxt)            {                 try                {                    ChineseChar chineseChar = new ChineseChar(obj);                    for (int i = 0; i < chineseChar.Pinyins.Count(); i++)                    {                        if (chineseChar.Pinyins[i] != null)                        {                            listStrFirst.Add(chineseChar.Pinyins[i].Substring(0, 1).ToLower().ToString());                        }                    }                }                catch                {                    listStrFirst.Add(obj.ToString());                }                listStrFirst = listStrFirst.Distinct().ToList();                if (listStrFirst.Count > 0 && listStrSecond.Count > 0)                {                    listStr.Clear();                    for (int i = 0; i < listStrFirst.Count; i++)                    {                        for (int m = 0; m < listStrSecond.Count; m++)                        {                            listStr.Add(listStrSecond[m] + listStrFirst[i]);                        }                    }                    listStrSecond.Clear();                    foreach (string str in listStr)                    {                        listStrSecond.Add(str);                    }                    listStrFirst.Clear();                }                else                {                    foreach (string strFirst in listStrFirst)                    {                        listStrSecond.Add(strFirst);                    }                    listStrFirst.Clear();                }            }            return listStr;        }

这样会罗列出输入的汉字的首字母的所有组合,我们把罗列出来的List集合放到一个Panel中,让用户自己进行选择,这样就可以解决多音字的问题。

        private void button1_Click(object sender, EventArgs e)        {            List<String> list = GetFirstPinyin(textBox1.Text);            if (list.Count > 1)            {                this.panel1.Visible = true;                for (int i = 0; i < list.Count(); i++)                {                    if (list[i] != null)                    {                        RadioButton rb = new RadioButton();                        rb.Text = list[i];                        rb.AutoSize = true;                        rb.Location = new System.Drawing.Point(22, 15 + i * 20);                        rb.Name = "radioButton"+i;                        rb.Size = new System.Drawing.Size(95, 16);                        rb.TabStop = true;                        rb.UseVisualStyleBackColor = true;                        rb.Click += rb_Click;                        this.panel1.Controls.Add (rb);                    }                }            }            else            {                this.textBox2.Text = list[0];            }        }        void rb_Click(object sender, EventArgs e)        {            RadioButton rb=(RadioButton )sender ;            this.textBox2.Text = rb.Text;            this.panel1.Visible = false;        }

我上传了示例源代码,下载地址为:http://download.csdn.net/detail/esunshine1985/8957295




0 0