C#汉字转拼音(支持多音字)

阅读目录

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

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

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

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

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

回到顶部

首先在nuget引用对应的包

查找 PinYinConverter

回到顶部

简单的demo

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

1             string ch = Console.ReadLine();
2             ChineseChar cc = new ChineseChar(ch[0]);
3             var pinyins = cc.Pinyins.ToList();
4             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;
        }
    }

调用方式:

                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

时间: 2024-10-29 19:12:15

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

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

GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个. 分区表示  GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号.这种表示方式也称为区位码. 1)01-09区为特殊符号. 2)16-55区为一级汉字,按拼音排序.  3)56-87区为二级汉字,按部首/笔画排序. 4)10-15区及88-94区则未有编码. 也就是说二级汉字与拼音不存在联系.这样网上大部分汉字转拼音类只能正确获取部分汉字的拼音(一级汉字).只有小数的3000多一点汉字.  而二

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

前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字典文件,无法根据实际需要满足需求. 综上,我精心整理并修改了网上几种常见的字典文件并简单封装了一下可以直接拿来用的工具库. 代码和DEMO演示 github项目地址:https://github.com/liuxianan/pinyinjs 完整demo演示:http://demo.liuxiana

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

原文:http://www.cnblogs.com/liuxianan/p/pinyinjs.html 前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字典文件,无法根据实际需要满足需求. 综上,我精心整理并修改了网上几种常见的字典文件并简单封装了一下可以直接拿来用的工具库. 这篇文章差不多一个月前就写好了大部分了,但是就差拼音输入法这一块一直没时

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

前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字典文件,无法根据实际需要满足需求. 综上,我精心整理并修改了网上几种常见的字典文件并简单封装了一下可以直接拿来用的工具库. 代码和DEMO演示 github项目地址:https://github.com/liuxianan/pinyinjs 完整demo演示:http://demo.liuxiana

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

ChineseUtil 下载地址:https://github.com/Yurunsoft/ChineseUtil PHP 中文工具类,支持汉字转拼音.拼音分词.简繁互转. PHP Chinese Tool class, support Chinese pinyin, pinyin participle, simplified and traditional conversion 目前本类库拥有的三个功能,都是在实际开发过程中整理出来的.这次使用的数据不同于以前我开源过汉字转拼音和简繁互转,数据

ios汉字转拼音,支持多音节

1 + (NSString *)transform:(NSString *)chinese 2 { 3 NSMutableString *pinyin = [chinese mutableCopy]; 4 CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO); 5 CFStringTransform((__bridge CFMutableStringRef

Microsoft Visual Studio International Pack 1.0 SR1--关于汉字转拼音

Microsoft Visual Studio International Pack 1.0 SR1————微软的一个类库 地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=15251 Visual Studio International Pack 包含一组类库,该类库扩展了.NET Framework对全球化软件开发的支持.使用该类库提供的类,.NET 开发人员可以更方便的创建支持多文化多语言的软件应用.SR1 包含对 Ja

用jpinyin实现汉字转拼音功能

一.简介 项目地址:https://github.com/stuxuhai/jpinyin JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进. [JPinyin主要特性]1.准确.完善的字库:Unicode编码从4E00-9FA5范围及3007(〇)的20903个汉字中,JPinyin能转换除46个异体字(异体字不存在标准拼音)之外的所有汉字:2.拼音转换速度快:经测试,转换Unicode编码从4E00-9FA5范围的20902个汉字,JPinyin耗

Java_开源框架_JPinyin汉字转拼音的Java开源库

本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/50039339 1.介绍 JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进.[JPinyin主要特性]1.准确.完善的字库:Unicode编码从4E00-9FA5范围及3007(〇)的20903个汉字中,JPinyin能转换除46个异体字(异体字不存在标准拼音)之外的所有汉字:2.拼音转换速度快:经测试,转换Unicode编