搜索框实现探讨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即可使用。
然后我就用它实现了转拼音的功能,废话少说,贴代码:
前台代码:
<!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>
后台代码:
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 == null) break;
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 == null) break;
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 利用对所有的用户拼音建立索引文件,然后去查找此索引即可。这样效率会很高。