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


        之前有提到过用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

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

    本文从百度空间搬家到博客园。。

    邮箱:yunanwu@foxmail.com 微博:@提灯寻影(http://weibo.com/wuyunnan) 技术主页:http://www.cnblogs.com/yuanawu/ 可以白手起家不可手无寸铁!我是我命运的主宰者,我是我灵魂的掌舵人! 每一次的选择都将是一个挑战!
  • 相关阅读:
    Caffe学习系列(16):caffe的整体流程
    caffe_windows安装
    r-cnn学习系列(三):从r-cnn到faster r-cnn
    Spatial pyramid pooling (SPP)-net (空间金字塔池化)笔记(转)
    r-cnn学习(二)
    r-cnn学习(一)
    Caffe学习系列(13):对训练好的模型进行fine-tune
    注解
    MATLAB实现回归分析
    MATLAB进行假设检验
  • 原文地址:https://www.cnblogs.com/yunanwu/p/4168571.html
Copyright © 2020-2023  润新知