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

来源:互联网 发布:百度联盟 域名推广 编辑:程序博客网 时间:2024/04/28 14:00

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

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

原创粉丝点击