• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#汉字转拼音实例(支持多音字)

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

作者:最爱晴天 字体:[增加 减小] 来源:互联网 时间:2017-05-28

最爱晴天 通过本文主要向大家介绍了等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

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

2.Javascript实现汉字和拼音互转的终极方案

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

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

结果如下:

我们可以看到, 行 的多音字有 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;
    }
  }

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

</div>

调用方式:

 Console.WriteLine("请输入中文:");
 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();
</div>

结果:

 

目前试过一些生僻字都是能支持,对于一些太偏的还没试过,不过对于一般汉字转拼音的,多音字支持这里就已经足够了。

这里仅仅是使用了 Microsoft Visual Studio International Pack 这个扩展包里面的汉字转拼音功能,其实里面还有中文、日文、韩文、英语等各国语言包,并提供方法实现互转、获、获取字数、甚至获取笔画数等等强大的功能,有兴趣的朋友可以自行查询下它的api。

 源码分享

分享是一种美德,有时候牛逼的文章可以提高我们的技术层面,但有时候更多的需求是业务层面,很多小知识应用的分享却可以帮我们提高业务层面的问题。只要分享的知识点有用,不误人子弟,哪怕大小都是一种学习,所以也希望大家能勇于分享。

 最后,源码分享出来给大家,如果有错误和不足的地方,也希望指正

地址:demo 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28C#实现控制摄像头的类
  • 2017-05-28C#十五子游戏编写代码
  • 2017-05-28C#正则表达式转义字符介绍
  • 2017-05-28C#值类型、引用类型中的Equals和==的区别浅析
  • 2017-05-28C#中实现Json序列化与反序列化的几种方式
  • 2017-05-28C#中文件名或文件路径非法字符判断方法
  • 2017-05-28c#测试反射性能示例
  • 2017-05-28visio二次开发--判断文档是否已发生变化(变化就加星号*)
  • 2017-05-28C# 重写ComboBox实现下拉任意组件的方法
  • 2017-05-28C#中单例的实现方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#基于XNA生成随机颜色的方法
    • C#中的位操作小结
    • C# 的关键字详细介绍
    • C#实现在服务器端裁剪图片的方法
    • C#中按字符串截取长字符串实例
    • 根据灰度值填充字符-单文件单线程版
    • c#调用c++方法介绍,window api
    • C#避免回溯方法心得
    • C#中判断、验证字符串是否为日期格式的实现代码
    • C#获取CPU处理器核心数量的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有