搜索框实现探讨3--文字转拼音的实现(唉,悲剧)

这几天真悲剧,大新年的~

昨天刚搞定字库,想用查字典的方法实现转换,今天发现了一个更强大更权威的方法,原来微软今年解决了这个问题推出了一个高级的东西~

这是我在园子里乱逛时,在一个角落里发现了一个评论,提供了一个地址,这个地址改变了我今天的生活(尽瞎扯)~

言归正传~

2009 年3月31日,微软发布了 Microsoft Visual Studio International Pack 1.0 SR1。Visual Studio International Pack 包含一组类库,该类库扩展了.NET Framework对全球化软件开发的支持。使用该类库提供的类,.NET 开发人员可以更方便的创建支持多文化多语言的软件应用。下载地址

该软件包1.0版提供下面七个组件以增强.NET Framework对全球化软件应用开发的支持。

East Asia Numeric Formatting Library - 支持将小写的数字字符串格式化成简体中文,繁体中文,日文和韩文的大写数字字符串。
Japanese Kana Conversion Library - 支持将日文假名(Kana)转化为另一种日文字符。
Japanese Text Alignment Library - 支持日文特有的一种对齐格式。
Japanese Yomi Auto-Completion Library - 类库支持感知日文输入法的输入自动完成和一个文本框控件的示例。
Korean Auto Complete TextBox Control - 支持韩文输入法的智能感知和输入自动完成的文本框控件。
Simplified Chinese Pin-Yin Conversion Library - 支持获取简体中文字符的常用属性比如拼音,多音字,同音字,笔画数。
Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool - 支持简繁体中文之间的转换。该组件还包含一个Visual Studio集成开发环境中的插件(Add-in)支持简繁体中文资源文件之间的转换。

以上是微软官方介绍~


下载完毕后,进行解压,里面有7个msi文件,其中:CHSPinYinConv.msi就是汉字拼音相关的,安装这个msi即可。安装完毕后,需要在VS里添加引用,引用:C:\Program Files\Microsoft Visual Studio International Pack\Simplified Chinese Pin-Yin Conversion Library下的dll即可使用。

然后我就用它实现了转拼音的功能,废话少说,贴代码:

前台代码:

 

前台代码
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    
<title>无标题页</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        
<asp:Literal ID="Literal1" runat="server"></asp:Literal>
        
<br />
        
<asp:HyperLink ID="HyperLink1" runat="server" 
            NavigateUrl
="http://www.cnblogs.com/zenglb/" style="font-size: medium">淡萣 10/1/1</asp:HyperLink>
    
</div>
    
</form>
</body>
</html>

 

 

后台代码:

 

后台代码
  1 using System;
  2 using System.Configuration;
  3 using System.Data;
  4 using System.Linq;
  5 using System.Web;
  6 using System.Web.Security;
  7 using System.Web.UI;
  8 using System.Web.UI.HtmlControls;
  9 using System.Web.UI.WebControls;
 10 using System.Web.UI.WebControls.WebParts;
 11 using System.Xml.Linq;
 12 using System.Collections.ObjectModel;
 13 using System.Collections.Generic;
 14 using Microsoft.International.Converters.PinYinConverter;
 15 using System.Text.RegularExpressions;
 16 using System.Text;
 17 
 18 public partial class _Default : System.Web.UI.Page
 19 {
 20     protected void Page_Load(object sender, EventArgs e)
 21     {
 22         ChineseChar chineseChar = new ChineseChar('');
 23         StringBuilder zlb = new StringBuilder(" <h2>关于汉字 “曾” 的相关信息:</h2> ");
 24         zlb.Append(" <li>“曾”笔画数: " + ChineseChar.GetStrokeNumber(''));
 25         zlb.Append(" <li>“曾”是否是多音字: " + chineseChar.IsPolyphone);
 26         ReadOnlyCollection<string> pinyin = chineseChar.Pinyins;
 27         zlb.Append(" <li>“曾”所有拼音: ");
 28         foreach (string pin in pinyin)
 29         {
 30             if (pin == nullbreak;
 31             zlb.Append(pin + " , ");
 32         }
 33 
 34         zlbout("ceng2",ref zlb);
 35         zlbout("zeng1",ref zlb);
 36         zlbout("zeng5",ref zlb);
 37         zlbcu("淡萣zeng曾lb",ref zlb);
 38         Literal1.Text = zlb.ToString();
 39     }
 40 
 41     private void zlbout(string py,ref StringBuilder zlb)
 42     {
 43         char[] ChineseChars;
 44         zlb.Append(" <li>所有拼音 " + py + " 的汉字<br/> ");
 45         ChineseChars = ChineseChar.GetChars(py);
 46         zlb.Append(" 共 " + ChineseChars.Length.ToString() + " 个,分别是: ");
 47         for (int i = 0; i < ChineseChars.Length; i++)
 48         {
 49             zlb.Append(ChineseChars[i] + " , ");
 50         }
 51     }
 52 
 53     private void zlbcu(string cu,ref StringBuilder zlb)
 54     {
 55         zlb.Append("<br/><br/><h2>要拼音化的字符串:“"+cu+"”</h2>");
 56         zlb.Append("<p>" + zlbwordTopy(cu) + "</p>");
 57     }
 58 
 59     private string zlbchsTopy(string zlbs)
 60     {
 61         StringBuilder sb = new StringBuilder();
 62         foreach (char chr in zlbs.ToCharArray())
 63         {
 64             foreach (string p in new ChineseChar(chr).Pinyins)
 65             {
 66                 if (p == nullbreak;
 67                 sb.Append(p);
 68             }
 69         }
 70         return Regex.Replace(sb.ToString(), @"[1-9]"string.Empty, RegexOptions.IgnoreCase);
 71     }
 72 
 73     public string zlbwordTopy(string str)
 74     {
 75         string s = str.Trim();
 76         s = s.Replace(" ""-");
 77         s = s.Replace("#""");
 78         string enStr = Regex.Replace(s, @"[\u4e00-\u9fa5]"" ", RegexOptions.IgnoreCase);
 79 
 80         if (enStr.Trim() == "")
 81         {
 82             s = zlbchsTopy(s);
 83         }
 84         else
 85         {
 86             enStr+= " ";
 87             List<string> strArr = new List<string>();
 88             List<string> chStrArr = new List<string>();
 89             string tempstr = string.Empty;
 90             for (int i = 0; i < enStr.Length; i++)
 91             {
 92                 if (enStr.Substring(i, 1!= " ")
 93                 {
 94                     tempstr += enStr.Substring(i, 1);
 95                 }
 96                 else
 97                 {
 98                     strArr.Add(tempstr);
 99                     tempstr = string.Empty;
100                 }
101             }
102 
103             string chStr = s + " ";
104             for (int i = 0; i < strArr.Count; i++)
105             {
106                 if (strArr[i].Length != 0)
107                 {
108                     chStr = chStr.Replace(strArr[i], " ");
109                 }
110             }
111             tempstr = string.Empty;
112             for (int i = 0; i < chStr.Length; i++)
113             {
114                 if (chStr.Substring(i, 1!= " ")
115                 {
116                     tempstr += chStr.Substring(i, 1);
117                 }
118                 else
119                 {
120                     chStrArr.Add(tempstr);
121                     tempstr = string.Empty;
122                 }
123             }
124 
125             for (int i = 0; i < chStrArr.Count; i++)
126             {
127                 if (chStrArr[i].Length != 0)
128                 {
129                     s = s.Replace(chStrArr[i], "-" + zlbchsTopy(chStrArr[i]) + "-");
130                 }
131             }
132         }
133         return s.Trim('-');
134     }
135 }

 

 

就是这样的,页面效果图如下:

 

 

我的方法是讲多音字的每个音都放在一起,字与字之间用“—”分开~

百度的效果如下图:

  

就是这样的~很强大的一个类库~

将拼音存入拼音字段后,我的初步对查询数据库的想法是where+正则表达式~

网上有人提出:使用开源的lucene   利用对所有的用户拼音建立索引文件,然后去查找此索引即可。这样效率会很高。

下一步就是好好看下lucene是什么东西啦~
 
           思路是这样子的,高人如有建议请留言~

 

posted @ 2010-01-01 20:03  淡萣  阅读(985)  评论(0编辑  收藏  举报