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

摘要:
关于拼音的操作,微软提供了一个可以使用的类库,非常有用。安装后,您需要在VS中添加一个引用,可以通过分别引用C:\ProgramFiles MicrosoftVisualStudioInternationalPack Simplified ChinesePin Yin Conversion Library(拼音)和C:\ProgramFiles MicrosoftStudio.InternationalPack Traditional ChinesetoImplied ChineseConversion Library和Add-InTool下的dll来使用//少一个是因为最后一个是数字s=s Substring;拼音+=s;}否则{拼音+=c;}}返回拼音;}以下函数是在内存中直接转换的代码,没有数据库字段。//搜索方法基于拼音。此方法不会将拼音保存在数据库中。

    之前有提到过用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 即可使用。

 

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

先看一下结果:

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

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

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


     

/// <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

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

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

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

免责声明:文章转载自《文本框根据拼音自动匹配提示》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Dapper 多表(三表以上)查询小技巧Oracle数据库中序列(SEQUENCE)的用法详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

程序员不得不知的 Navicat 实用工具

Navicat是一种比较常见的数据库管理工具,其提供数种在使用 Navicat 时能改善用户体验的工具,包括对象信息、连接颜色、搜索筛选以及更多。下面我们就来给大家介绍介绍。 对象信息 在对象列表,用户可以查看已选择对象的信息。从主菜单选择查看->对象信息,或在对象上右击并从弹出菜单选择“对象信息”。需要注意的是,选项卡根据用户所选择的对象类型而定。...

磁盘问题定位与解决

磁盘问题定位基本流程:     磁盘的压力分析,主要使用下面几个性能计数器 (针对单独的物理盘,每个物理磁盘都会有一组): Avg. Disk Read Queue Length   读队列(越小越好,理想值 2 以下,队列越高说明一个操作的响应时间越长) Avg. Disk Write Queue Length  写队列(越小越好,理想值 2 以下...

ETL工具之Kettle的简单使用一(不同数据库之间的数据抽取-转换-加载)

ETL工具之Kettle将一个数据库中的数据提取到另外一个数据库中: 1.打开ETL文件夹,双击Spoon.bat启动Kettle 2.资源库选择,诺无则选择取消 3.选择关闭 4.新建一个转换 5.配置所需数据库 6.将需要进行提取的数据表,用表输入得到 7.选择源数据所在数据库及表,sql语句可自...

orcl透明数据库加密(TDE)加密表空间

TDE加密介绍 透明数据加密包括列加密和表空间加密,它是oracle高级安全组件的一部分;oracle11g企业版默认安装时会安装上oracle高级安全组件,oracle声称这是一个单独另外收费的组件,作为商业用途使用如果没有付费意味着侵权。 oracle增强表空间加密特性,数据库的兼容性参数必须被设置为11.2或更高。 oracle的列加密是从10gR2...

mysql导出导入sql文件方法(linux)

一、导入导出.sql文件for Linux: 1、从mysql中导出数据库test: 在终端运行:mysqldump -h localhost -u root -p test > /home/chuzj/daochu.sql 其中localhost是服务器名字 test是数据库名字,其后可以直接跟表名 2、将daochu.sql 导入到mysql数...

sql 获取数据库表名与某表的列名

1:获取某表的列名 select 列名=name from syscolumns where id=object_id(表名') 2:获取数据库表中的表名 select 表名=name from sysobjects where objectproperty(id, 'isusertable ')=1 3:获取数据库表中的列名、字段类型、字段长度 sele...