服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#汉字转拼音实例(支持多音字)

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

2021-12-15 13:17最爱晴天 C#

几年前就在网上看到过汉字转拼音的程序,大都就是按汉字的编码转换,单字对应的算法实现的。但是都有一个共同的缺点,不能支持多音字。本篇文章主要介绍了C#汉字转拼音实例(支持多音字),有兴趣的可以了解一下。

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

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

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

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

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

首先在nuget引用对应的包

查找 pinyinconverter

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

简单的demo

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

?
1
2
3
4
string ch = console.readline();
chinesechar cc = new chinesechar(ch[0]);
var pinyins = cc.pinyins.tolist();
pinyins.foreach(console.writeline);

结果如下:

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

我们可以看到, 行 的多音字有 hang,heng,xing 三个,这里连音标也出来了,确实很方便。而我需要的功能是输入 银行 ,然后转换为拼音是 yinhang,yinheng,yinxing,  首拼是 yh,yx。有chinesechar 这个类的话做起来思路就简单了。

汉字转拼音类封装

1.首先对输入的汉字进行拆分

2.接着每个汉字用chinesechar 获取多个拼音

3.然后除去数字,去重,提取首字符,再在进行组合就好了

于是写了个帮助类进行装换,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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; }
}

调用方式:

?
1
2
3
4
5
6
7
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();

结果:

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

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

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

 源码分享

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

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

地址:demo 

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

原文链接:http://www.cnblogs.com/qtqq/p/6195641.html#_label0

延伸 · 阅读

精彩推荐
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20