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

首先,从微软官网下载安装包: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值