之前由于项目需要,中间需要一个汉字转拼音和首拼的功能来做查询,感觉这种功能基本已经成熟化了,于是查找了相关的代码,首先引入眼帘的是下面两篇文章

     1.C# 汉字转拼音(支持GB2312字符集中所有汉字)

     2.【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法

  感谢两位博主,写的比较全也很详细,都有提供源码,大家可以参考下。

  由于考虑到接口的需要,于是参考了 第一篇,文章中作者的源码基本能满足汉字转拼音的需要,对于其他特殊的字符,也可以在进行添加补充,不足之处就是不支持多音字,由于需要支持多音字的查询,所以后面有查了下其他的文章,发现还没有现成的文章(也可能本人的搜索水平比较水)。后来查找发现对于汉字转拼音,原来微软已经提供了 Microsoft Visual Studio International Pack ,而且很强大。于是试了一下

首先在nuget引用对应的包

查找 PinYinConverter

简单的demo

小试一下,使用也非常简单,只要直接使用ChineseChar类进行装换就好

             string ch = Console.ReadLine();
ChineseChar cc = new ChineseChar(ch[]);
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 = ; 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 <= )
{
result.TotalPingYin = items;
result.FirstPingYin = items.ConvertAll(p => p.Substring(, )).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(, )));
}
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

C#汉字转拼音(支持多音字)的更多相关文章

  1. CPinyin unicode汉字查找拼音(支持多音字)

    下载代码 --------------------------------------------------------------------------------- 虽然很笨的办法,却非常有效 ...

  2. C# 汉字转拼音(支持GB2312字符集中所有汉字)

    GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个. 分区表示  GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号.这种表示方式也称为区位码. )- ...

  3. JavaScript 汉字与拼音互转终极方案 附JS拼音输入法

    转:http://www.codeceo.com/article/javascript-pinyin.html 前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的 ...

  4. 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法

    前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字 ...

  5. JS版汉字与拼音互转终极方案,附简单的JS拼音输入法

    原文:http://www.cnblogs.com/liuxianan/p/pinyinjs.html 前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多 ...

  6. JS版汉字与拼音互转终极方案,附简单的JS拼音

    前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字 ...

  7. AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字,Filterable的使用)

    AutoCompleteTextView具有输入提示的功能,但是它的这种提示不适合对股票列表的过滤,如果你玩过股票软件,就会知道只要输入股票名称的首字母或股票代码就会出现符合匹配的股票,这种过滤怎么实 ...

  8. Windows API方式直接调用C#的DLL,支持多音字转拼音、Gzip解压缩、公式计算(VBA、C++、VB、Delphi甚至java都可以)

    原始链接 https://www.cnblogs.com/Charltsing/p/DllExport.html 这两年,我在VBA应用方面一直有几大痛点:1.多音字转拼音:2.64位下的GZIP解压 ...

  9. PHP 中文工具类,支持汉字转拼音、拼音分词、简繁互转

    ChineseUtil 下载地址:https://github.com/Yurunsoft/ChineseUtil 另外一个中文转拼音工具:https://github.com/overtrue/pi ...

随机推荐

  1. [ASP.NET MVC 小牛之路]01 - 理解MVC模式

    本人博客已转移至:http://www.exblr.com/liam  PS:MVC出来很久了,工作上一直没机会用.出于兴趣,工作之余我将展开对MVC的深入学习,通过博文来记录所学所得,并希望能得到各 ...

  2. java中构造方法的特殊性

    构造方法名与类名相同 构造方法没有返回值,也不能写void 构造方法的主要作用是完成对对象的初始化工作 构造方法一般不由编程人员显示调用,而是由new来调用 在创建一个类的对象的同时,系统会自动调用该 ...

  3. OData的初步认识

    What – OData是什么? OData - Open Data Protocal,是一个设计和使用RESTful API的标准.REST本身只是一个构建web服务的思想和理念,其没有规定一个统一 ...

  4. 升级CentOS内核 - 2.6升级到3.10

    *因为学习docker的需要,docker的官方推荐内核使用3.8以上,所以本人决定把CentOS内核升到长期稳定版的3.10. ##记得切换到root用户执行升级操作. [root@localhos ...

  5. 2013 duilib入门简明教程 -- FAQ (19)

        虽然前面的教程几乎把所有的知识点都罗列了,但是有很多问题经常在群里出现,所以这里再次整理一下.     需要注意的是,在下面的问题中,除了加上XML属性外,主窗口必须继承自WindowImpl ...

  6. LeetCode OJ1:Reverse Words in a String

    问题描述: Given an input string, reverse the string word by word. For example,Given s = "the sky is ...

  7. 蓝桥杯 十六进制转八进制(超大测试数据,java实现)

    问题描述 给定n个十六进制正整数,输出它们对应的八进制数.输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转换 ...

  8. VS无法设置断点的解决方案

    第一种情况的处理 第二种情况的处理

  9. WPF如何仿制QQ2013登录窗口的关闭效果

    昨天,有位朋友问我,WPF能做出像QQ2013窗口在关闭时那个貌似透明过渡的动画吗?我就歪着脸跟他说:"只有你想不到的,没有WPF做不到的". 他又接着说:"我知道肯定会 ...

  10. Myeclipse 安装SVN步骤

    非在线安装 首先来这儿下载插件 http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 找个最新的下载 解压到对应 ...