C#漢字轉(zhuǎn)拼音實(shí)例(支持多音字)
之前由于項(xiàng)目需要,中間需要一個(gè)漢字轉(zhuǎn)拼音和首拼的功能來(lái)做查詢,感覺這種功能基本已經(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)成的文章(也可能本人的搜索水平比較水)。后來(lái)查找發(fā)現(xiàn)對(duì)于漢字轉(zhuǎn)拼音,原來(lái)微軟已經(jīng)提供了 Microsoft Visual Studio International Pack ,而且很強(qiáng)大。于是試了一下
首先在nuget引用對(duì)應(yīng)的包
查找 PinYinConverter

簡(jiǎn)單的demo
小試一下,使用也非常簡(jiǎn)單,只要直接使用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)也出來(lái)了,確實(shí)很方便。而我需要的功能是輸入 銀行 ,然后轉(zhuǎn)換為拼音是 yinhang,yinheng,yinxing, 首拼是 yh,yx。有ChineseChar 這個(gè)類的話做起來(lái)思路就簡(jiǎn)單了。
漢字轉(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é)果:

目前試過(guò)一些生僻字都是能支持,對(duì)于一些太偏的還沒試過(guò),不過(guò)對(duì)于一般漢字轉(zhuǎn)拼音的,多音字支持這里就已經(jīng)足夠了。
這里僅僅是使用了 Microsoft Visual Studio International Pack 這個(gè)擴(kuò)展包里面的漢字轉(zhuǎn)拼音功能,其實(shí)里面還有中文、日文、韓文、英語(yǔ)等各國(guó)語(yǔ)言包,并提供方法實(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í),所以也希望大家能勇于分享。
最后,源碼分享出來(lái)給大家,如果有錯(cuò)誤和不足的地方,也希望指正
地址:demo
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C# TimeSpan 計(jì)算時(shí)間差(時(shí)間間隔)
本篇文章主要介紹了C# TimeSpan 計(jì)算時(shí)間差(時(shí)間間隔),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12
C#使用晚綁定來(lái)實(shí)現(xiàn)壓縮Access數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C#使用晚綁定來(lái)實(shí)現(xiàn)壓縮Access數(shù)據(jù)庫(kù)的方法,項(xiàng)目開發(fā)中有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-08-08
asp.net core項(xiàng)目mvc權(quán)限控制:分配權(quán)限
學(xué)習(xí)的最好方法就是動(dòng)手去做,這里以開發(fā)一個(gè)普通的權(quán)限管理系統(tǒng)的方式來(lái)從零體驗(yàn)和學(xué)習(xí)Asp.net Core。項(xiàng)目的整體規(guī)劃大致如下2017-02-02
C#中加載dll并調(diào)用其函數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇C#中加載dll并調(diào)用其函數(shù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
C#實(shí)現(xiàn)連接電子秤串口自動(dòng)稱重
這篇文章介紹了C#實(shí)現(xiàn)連接電子秤串口自動(dòng)稱重的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C#實(shí)現(xiàn)左截取和右截取字符串實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)左截取和右截取字符串實(shí)例,是針對(duì)字符串的常用操作,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10

