C#漢字轉(zhuǎn)拼音實(shí)例(支持多音字)
之前由于項(xiàng)目需要,中間需要一個(gè)漢字轉(zhuǎn)拼音和首拼的功能來做查詢,感覺這種功能基本已經(jīng)成熟化了,于是查找了相關(guān)的代碼,首先引入眼簾的是下面兩篇文章
1.C# 漢字轉(zhuǎn)拼音(支持GB2312字符集中所有漢字)
2.Javascript實(shí)現(xiàn)漢字和拼音互轉(zhuǎn)的終極方案
寫的比較全也很詳細(xì),都有提供源碼,大家可以參考下。
由于考慮到接口的需要,于是參考了 第一篇,文章中作者的源碼基本能滿足漢字轉(zhuǎn)拼音的需要,對(duì)于其他特殊的字符,也可以在進(jìn)行添加補(bǔ)充,不足之處就是不支持多音字,由于需要支持多音字的查詢,所以后面有查了下其他的文章,發(fā)現(xiàn)還沒有現(xiàn)成的文章(也可能本人的搜索水平比較水)。后來查找發(fā)現(xiàn)對(duì)于漢字轉(zhuǎn)拼音,原來微軟已經(jīng)提供了 Microsoft Visual Studio International Pack ,而且很強(qiáng)大。于是試了一下
首先在nuget引用對(duì)應(yīng)的包
查找 PinYinConverter
簡單的demo
小試一下,使用也非常簡單,只要直接使用ChineseChar類進(jìn)行裝換就好
string ch = Console.ReadLine(); ChineseChar cc = new ChineseChar(ch[0]); var pinyins = cc.Pinyins.ToList(); pinyins.ForEach(Console.WriteLine);
結(jié)果如下:
我們可以看到, 行 的多音字有 hang,heng,xing 三個(gè),這里連音標(biāo)也出來了,確實(shí)很方便。而我需要的功能是輸入 銀行 ,然后轉(zhuǎn)換為拼音是 yinhang,yinheng,yinxing, 首拼是 yh,yx。有ChineseChar 這個(gè)類的話做起來思路就簡單了。
漢字轉(zhuǎn)拼音類封裝
1.首先對(duì)輸入的漢字進(jìn)行拆分
2.接著每個(gè)漢字用ChineseChar 獲取多個(gè)拼音
3.然后除去數(shù)字,去重,提取首字符,再在進(jìn)行組合就好了
于是寫了個(gè)幫助類進(jìn)行裝換,代碼如下:
public class PinYinConverterHelp { public static PingYinModel GetTotalPingYin(string str) { var chs = str.ToCharArray(); //記錄每個(gè)漢字的全拼 Dictionary<int, List<string>> totalPingYins = new Dictionary<int, List<string>>(); for (int i = 0; i < chs.Length; i++) { var pinyins = new List<string>(); var ch = chs[i]; //是否是有效的漢字 if (ChineseChar.IsValidChar(ch)) { ChineseChar cc = new ChineseChar(ch); pinyins = cc.Pinyins.Where(p => !string.IsNullOrWhiteSpace(p)).ToList(); } else { pinyins.Add(ch.ToString()); } //去除聲調(diào),轉(zhuǎn)小寫 pinyins = pinyins.ConvertAll(p => Regex.Replace(p, @"\d", "").ToLower()); //去重 pinyins = pinyins.Where(p => !string.IsNullOrWhiteSpace(p)).Distinct().ToList(); if (pinyins.Any()) { totalPingYins[i] = pinyins; } } PingYinModel result = new PingYinModel(); foreach (var pinyins in totalPingYins) { var items = pinyins.Value; if (result.TotalPingYin.Count <= 0) { result.TotalPingYin = items; result.FirstPingYin = items.ConvertAll(p => p.Substring(0, 1)).Distinct().ToList(); } else { //全拼循環(huán)匹配 var newTotalPingYins = new List<string>(); foreach (var totalPingYin in result.TotalPingYin) { newTotalPingYins.AddRange(items.Select(item => totalPingYin + item)); } newTotalPingYins = newTotalPingYins.Distinct().ToList(); result.TotalPingYin = newTotalPingYins; //首字母循環(huán)匹配 var newFirstPingYins = new List<string>(); foreach (var firstPingYin in result.FirstPingYin) { newFirstPingYins.AddRange(items.Select(item => firstPingYin + item.Substring(0, 1))); } newFirstPingYins = newFirstPingYins.Distinct().ToList(); result.FirstPingYin = newFirstPingYins; } } return result; } } public class PingYinModel { public PingYinModel() { TotalPingYin = new List<string>(); FirstPingYin = new List<string>(); } //全拼 public List<string> TotalPingYin { get; set; } //首拼 public List<string> FirstPingYin { get; set; } }
調(diào)用方式:
Console.WriteLine("請(qǐng)輸入中文:"); string str = Console.ReadLine(); var strs = PinYinConverterHelp.GetTotalPingYin(str).TotalPingYin; var frists = PinYinConverterHelp.GetTotalPingYin(str).FirstPingYin; Console.WriteLine("全拼音:" + String.Join(",", strs)); Console.WriteLine("首音:" + String.Join(",", frists)); Console.WriteLine();
結(jié)果:
目前試過一些生僻字都是能支持,對(duì)于一些太偏的還沒試過,不過對(duì)于一般漢字轉(zhuǎn)拼音的,多音字支持這里就已經(jīng)足夠了。
這里僅僅是使用了 Microsoft Visual Studio International Pack 這個(gè)擴(kuò)展包里面的漢字轉(zhuǎn)拼音功能,其實(shí)里面還有中文、日文、韓文、英語等各國語言包,并提供方法實(shí)現(xiàn)互轉(zhuǎn)、獲、獲取字?jǐn)?shù)、甚至獲取筆畫數(shù)等等強(qiáng)大的功能,有興趣的朋友可以自行查詢下它的api。
源碼分享
分享是一種美德,有時(shí)候牛逼的文章可以提高我們的技術(shù)層面,但有時(shí)候更多的需求是業(yè)務(wù)層面,很多小知識(shí)應(yīng)用的分享卻可以幫我們提高業(yè)務(wù)層面的問題。只要分享的知識(shí)點(diǎn)有用,不誤人子弟,哪怕大小都是一種學(xué)習(xí),所以也希望大家能勇于分享。
最后,源碼分享出來給大家,如果有錯(cuò)誤和不足的地方,也希望指正
地址:demo
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:c#單例模式(Singleton)的6種實(shí)現(xiàn)
欄 目:C#教程
本文標(biāo)題:C#漢字轉(zhuǎn)拼音實(shí)例(支持多音字)
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6071.html
您可能感興趣的文章
- 01-10C#實(shí)現(xiàn)實(shí)體類與字符串互相轉(zhuǎn)換的方法
- 01-10C# readnodefile()不能讀取帶有文件名為漢字的osg文件解決方法
- 01-10時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒)
- 01-10C#實(shí)現(xiàn)HTML轉(zhuǎn)WORD及WORD轉(zhuǎn)PDF的方法
- 01-10C#編程實(shí)現(xiàn)對(duì)象與JSON串互相轉(zhuǎn)換實(shí)例分析
- 01-10Silverlight將圖片轉(zhuǎn)換為byte的實(shí)現(xiàn)代碼
- 01-10C#使用正則表達(dá)式實(shí)現(xiàn)首字母轉(zhuǎn)大寫的方法
- 01-10C#中使用JSON.NET實(shí)現(xiàn)JSON、XML相互轉(zhuǎn)換
- 01-10C#簡易圖片格式轉(zhuǎn)換器實(shí)現(xiàn)方法
- 01-10C#實(shí)現(xiàn)XSL轉(zhuǎn)換的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?