C#漢字轉拼音(支持多音字)

  以前因爲項目須要,中間須要一個漢字轉拼音和首拼的功能來作查詢,感受這種功能基本已經成熟化了,因而查找了相關的代碼,首先引入眼簾的是下面兩篇文章html

     1.C# 漢字轉拼音(支持GB2312字符集中全部漢字)git

     2.【乾貨】JS版漢字與拼音互轉終極方案,附簡單的JS拼音輸入法github

  感謝兩位博主,寫的比較全也很詳細,都有提供源碼,你們能夠參考下。api

  因爲考慮到接口的須要,因而參考了 第一篇,文章中做者的源碼基本能知足漢字轉拼音的須要,對於其餘特殊的字符,也能夠在進行添加補充,不足之處就是不支持多音字,因爲須要支持多音字的查詢,因此後面有查了下其餘的文章,發現尚未現成的文章(也可能本人的搜索水平比較水)。後來查找發現對於漢字轉拼音,原來微軟已經提供了 Microsoft Visual Studio International Pack ,並且很強大。因而試了一下學習

首先在nuget引用對應的包

 查找 PinYinConverterspa

簡單的demo

小試一下,使用也很是簡單,只要直接使用ChineseChar類進行裝換就好code

1             string ch = Console.ReadLine();
2             ChineseChar cc = new ChineseChar(ch[0]);
3             var pinyins = cc.Pinyins.ToList();
4             pinyins.ForEach(Console.WriteLine);

結果以下:htm

  咱們能夠看到, 行 的多音字有 hang,heng,xing 三個,這裏連音標也出來了,確實很方便。而我須要的功能是輸入 銀行 ,而後轉換爲拼音是 yinhang,yinheng,yinxing,  首拼是 yh,yx。有ChineseChar 這個類的話作起來思路就簡單了。blog

 漢字轉拼音類封裝

  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;
        }
    }

 

調用方式:

                Console.WriteLine("請輸入中文:");
                string str = Console.ReadLine();
                var pingyins = PinYinConverterHelp.GetTotalPingYin(str);
                Console.WriteLine("全拼音:" + String.Join(",", pingyins.TotalPingYin));
                Console.WriteLine("首音:" + String.Join(",", pingyins.FirstPingYin));
                Console.WriteLine();

結果:

目前試過一些生僻字都是能支持,對於一些太偏的還沒試過,不過對於通常漢字轉拼音的,多音字支持這裏就已經足夠了。

這裏僅僅是使用了 Microsoft Visual Studio International Pack 這個擴展包裏面的漢字轉拼音功能,其實裏面還有中文、日文、韓文、英語等各國語言包,並提供方法實現互轉、獲、獲取字數、甚至獲取筆畫數等等強大的功能,有興趣的朋友能夠自行查詢下它的api

源碼分享

  分享是一種美德,有時候牛逼的文章能夠提升咱們的技術層面,但有時候更多的需求是業務層面,不少小知識應用的分享卻能夠幫咱們提升業務層面的問題。只要分享的知識點有用,不誤人子弟,哪怕大小都是一種學習,因此也但願你們能敢於分享。

  最後,源碼分享出來給你們,若是有錯誤和不足的地方,也但願指正

  地址:https://github.com/qq1206676756/PinYinParse

相關文章
相關標籤/搜索