之前由於項目需要,中間需要一個漢字轉拼音和首拼的功能來做查詢,感覺這種功能基本已經成熟化了,於是尋找了相關的代碼,首先引入眼帘的是下面兩篇文章
C# 漢字轉拼音(支援GB2312字元集中所有漢字)(http://www.cnblogs.com/cxd4321/p/4203383.html)
【乾貨】JS版漢字與拼音互轉終極方案,附簡單的JS拼音IME(http://www.cnblogs.com/liuxianan/p/pinyinjs.html)
感謝兩位博主,寫的比較全也很詳細,都有提供源碼,大家可以參考下。
由於考慮到介面的需要,於是參考了 第一篇,文章中作者的源碼基本能滿足漢字轉拼音的需要,對於其他特殊的字元,也可以在進行添加補充,不足之處就是不支援多音字,由於需要支援多音字的查詢,所以後面有查了下其他的文章,發現還沒有現成的文章(也可能本人的搜尋水平比較水)。
後來尋找發現對於漢字轉拼音,原來微軟已經提供了 Microsoft Visual Studio International Pack ,而且很強大。於是試了一下
首先在nuget引用對應的包
尋找 PinYinConverter
簡單的demo
小試一下,使用也非常簡單,只要直接使用ChineseChar類進行裝換就好
string ch = Console.ReadLine();ChineseChar cc = new ChineseChar(ch[0]);var pinyins = cc.Pinyins.ToList();pinyins.ForEach(Console.WriteLine);
結果如下:
我們可以看到, 行 的多音字有 hang,heng,xing 三個,這裡連音標也出來了,確實很方便。而我需要的功能是輸入 銀行 ,然後轉換為拼音是 yinhang,yinheng,yinxing, 首拼是 yh,yx。有ChineseChar 這個類的話做起來思路就簡單了。
漢字轉拼音類封裝
1.首先對輸入的漢字進行拆分
2.接著每個漢字用ChineseChar 擷取多個拼音
3.然後除去數字,去重,提取首字元,再在進行組合就好了
於是寫了個協助類進行裝換,代碼如下:
public class PinYinConverterHelp { public static PingYinModel GetTotalPingYin(string str) { var chs = str.ToCharArray(); //記錄每個漢字的全拼 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()); } //去除聲調,轉小寫 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 { //全拼迴圈匹配 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; //首字母迴圈匹配 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; } }
結果:
目前試過一些生僻字都是能支援,對於一些太偏的還沒試過,不過對於一般漢字轉拼音的,多音字支援這裡就已經足夠了。
這裡僅僅是使用了 Microsoft Visual Studio International Pack 這個擴充包裡面的漢字轉拼音功能,其實裡面還有中文、日文、韓文、英語等各國語言套件,並提供方法實現互轉、獲、擷取字數、甚至擷取筆畫數等等強大的功能,有興趣的朋友可以自行查詢下它的api。
源碼分享
分享是一種美德,有時候牛逼的文章可以提高我們的技術層面,但有時候更多的需求是業務層面,很多小知識應用的分享卻可以幫我們提高業務層面的問題。只要分享的知識點有用,不誤人子弟,哪怕大小都是一種學習,所以也希望大家能勇於分享。
地址:https://github.com/qq1206676756/PinYinParse
以上就是C#漢字轉拼音(支援多音字)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!