文本框根据拼音自动匹配提示

2012-11-12 21:30

    之前有提到过用jquery来实现文本框的自动匹配http://hi.baidu.com/yunanwu/item/2a5aa13b1607fa26b3c0c522 ) 发现只能用汉字的匹配,又觉得吧平时在用百度谷歌的时候,输入拼音的时候也可以直接提示,就琢磨着自己实现一下这个功能(发现自己现在看到网页的功能,都要联想着自己去写了)。

关于拼音的操作,微软提供了一个类库可以使用,感觉挺好用的。类库的名字叫做 Visual Studio International Pack 

百度网盘下载<无需安装,直接引用DLL >      官方下载

官方下载之后需要找到一下DLL文件:

下载解压之后可以发现7个MSI安装文件,其中CHSPinYinConv.msi是汉字拼音组件,CHTCHSConv.msi是进行繁简体互转组件,安装这两个MSI就可以了 (x86操作系统上的默认安装目录是 C:\Program Files\Microsoft Visual Studio International Pack\) 。安装完毕后,需要在VS里添加引用,分别引用:C:\Program Files\Microsoft Visual Studio International Pack\Simplified Chinese Pin-Yin Conversion Library(拼音)下和C:\Program Files\Microsoft Visual Studio International Pack\Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool(繁简互转)下的dll 即可使用。

文本框自动匹配提示的功能之前写过了就不提了,说下拼音操作的代码吧,其实实现吧也有两种方法,一种就是直接在内存中转换拼音的,另外一种就是在数据库中添加一个字段用于存放拼音,个人感觉第二个效率应该会高点(没测试过)

先看一下结果:

首先这个函数是将字符串转换为拼音的代码

       /// <summary>
        /// //获取字符串的汉语拼音
        /// </summary>
        /// <param name="str">需要转换的字符串</param>
        /// <returns>拼音字符串</returns>
        public string GetPinYin(string str)
        {
            string pinyin = null;
            foreach (char c in str)
            {
                //判断是否可以构成中中文字符
                if (ChineseChar.IsValidChar(c))
                {

                 //实例化一个汉字字符
                    ChineseChar cc = new ChineseChar(c);
                    string s = cc.Pinyins[0].ToString();

     //这边如果只截取首字母,就可以实现通过首字母来匹配。

    //少截取一个是因为最后一个是表示拼音的第几声
                    s = s.Substring(0, s.Length - 1);
                    pinyin += s;
                }
                else
                {
                    pinyin += c;
                }
            }

            return pinyin;

        }

 


 

下面这个函数是没有数据库字段,直接在内存中转换的代码

        //根据拼音搜索的方法。。此方法为不在数据库中保存拼音的方法。
        public List<string> getAllTable(string key)
        {
            try
            {
                //连接数据库
                SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=DB_Search;Integrated Security=True");
                string sqlstr = "select Search,COUNT(*) from Search  group by Search  order by COUNT(*) desc ";
                conn.Open();
                //提取数据库中的数据
                SqlDataAdapter sda = new SqlDataAdapter(sqlstr, conn);
                DataSet ds = new DataSet();
                sda.Fill(ds);
                //再读取得到的DataTable中添加一列用于存放拼音。
                ds.Tables[0].Columns.Add("pinyin");
                //遍历,对每个字符串进行拼音的转换
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    string pinyin = GetPinYin(dr["Search"].ToString());
                    dr["pinyin"] = pinyin;
                }
                //获取搜索的关键字拼音(如果为拼音则不变)
                key = GetPinYin(key);
               List<string> result = new List<string>();
               DataRow[]  drs=  ds.Tables[0].Select("pinyin like '" + key + "%'");
               foreach (DataRow dr in drs)
               {
                   result.Add(dr["Search"].ToString());
               }

               return result;
            }
            catch (Exception ex)
            {
                // logger.Error("AJAX请求失败....", ex);
                return null;
            } finally { 
            //这边记得释放资源

             }

        }


 

但是对上面的代码,应该都会觉得很浪费内存,因为每次的AJAX请求都需要转换拼音。

所以在数据库中添加一个字段(SearchPinyin)

 



//根据拼音搜索的方法。。此方法为在数据库中有保存拼音的字段。
        public List<string> getAllTableByDb(string key)
        {
            try
            {  //获取搜索的关键字拼音(如果为拼音则不变)
                key = GetPinYin(key);
                List<string> list = new List<string>();
                SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=DB_Search;Integrated Security=True");
                string sqlstr = "select  Search,COUNT(*) from Search where SearchPinyin like '" + key + "%' group by SearchPinyin,Search  order by COUNT(*) desc ";
                conn.Open();
                SqlCommand cmd = new SqlCommand(sqlstr, conn);
                SqlDataReader sdr = cmd.ExecuteReader();
                while (sdr.Read())
                {
                    list.Add(sdr["Search"].ToString());
                }

                sdr.Close();
                conn.Close();
                return list;
            }
            catch (Exception ex)
            {
                // logger.Error("AJAX请求失败....", ex);
                return null;
            }finally { 
            //这边记得释放资源 

           }

        }


 


 

下面是调用的代码

   

  public void ProcessRequest(HttpContext context)
        {
            string key = context.Request["keyword"];
            context.Response.ContentType = "text/plain";

             List<string> list =null;
            if (key != "")
            {
               // list = getAllTable(key);
                list = getAllTableByDb(key);
                
            }
            else
            {
                list = new List<string>();
            }
             JavaScriptSerializer jss = new JavaScriptSerializer();
            string strRes = jss.Serialize(list);
            context.Response.Write(strRes);
        }


 

有兴趣还可以用这个开发包开发一个输入法。。

源文件下载地址:http://pan.baidu.com/share/link?shareid=104250&uk=839021066

下面这个是数据库的简要设计

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值