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

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

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

结果如下:

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

调用方式:

 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();

结果:

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

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

 源码分享

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

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

地址:demo

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

(0)

相关推荐

  • C#实现汉字转拼音或转拼音首字母的方法

    本文实例讲述了C#实现汉字转拼音或转拼音首字母的方法.分享给大家供大家参考.具体实现方法如下: /// <summary> /// 汉字转拼音或转拼音首字母 /// </summary> public class ChineseToSpell { private static int[] pyValue = new int[] { -20319,-20317,-20304,-20295,-20292,-20283,-20265,-20257,-20242,-20230,-20051

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

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

  • C#中实现输入汉字获取其拼音(汉字转拼音)的2种方法

    前不久看到有的朋友实现对商品名称拼音的录入,发现他的实现方式是手动输入的,-_-#.同志们,福利来了! 本文刚发布时,只写了一个实现方式,使用的是微软的语言包,但是对多音字的效果不怎么理想,甚至个别字会出现很诡异的错误,因此,现在扩展另一个方法,手动实现. 方式一.使用微软语言包 微软为了开发者实现国际化语言的互转,提供了Microsoft Visual Studio International Pack,这个扩展包里面有中文.日文.韩文.英语等各国语言包,并提供方法实现互转.获取拼音.获取字数

  • C# 汉字转拼音(全拼和首字母)实例

    (一)将汉字转化成全拼代码: 复制代码 代码如下: private void button1_Click(object sender, EventArgs e)    {        this.textBox2.Text = Hz2Py.Convert(this.textBox1.Text);    } 汉字转拼音类: 复制代码 代码如下: /// <summary>    /// 汉字转拼音类    /// </summary>    public class Hz2Py   

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

    之前由于项目需要,中间需要一个汉字转拼音和首拼的功能来做查询,感觉这种功能基本已经成熟化了,于是查找了相关的代码,首先引入眼帘的是下面两篇文章 1.C# 汉字转拼音(支持GB2312字符集中所有汉字) 2.Javascript实现汉字和拼音互转的终极方案 写的比较全也很详细,都有提供源码,大家可以参考下. 由于考虑到接口的需要,于是参考了 第一篇,文章中作者的源码基本能满足汉字转拼音的需要,对于其他特殊的字符,也可以在进行添加补充,不足之处就是不支持多音字,由于需要支持多音字的查询,所以后面有查

  • android实现汉字转拼音功能 带多音字识别

    android 汉字转拼音带多音字识别功能,供大家参考,具体内容如下 问题来源 在做地名按首字母排序的时候出现了这样一个bug.长沙会被翻译拼音成zhangsha,重庆会被翻译拼音成zhong qing.于是排序出了问题. 汉字转拼音库和多音字识别库 1.多音字对应的词汇库 2.文字的二进制大小对应的拼音库 关键代码 1.我在这里首先将要转化的文字转化成对应的"gb2312"编码.汉字转化成二进制编码一般占两个字节,如果一个字节返回字符,如果是两个字节算一下偏移量.代码如下 /** *

  • 教你使用Python pypinyin库实现汉字转拼音

    一.前言 这里我先为大家提供一个中文网站,大家可以下去更深入的学习. https://pypi.org/project/pypinyin/ pypinyin库,主要有几下几个特性: 智能匹配最正确的拼音: 支持多音字.繁体字: 支持多种不同拼音.注音风格: 该库属于第三方Python库,因此在使用之前,需要提前安装. pip install pypinyin 然后,导入该库即可. import pypinyin from pypinyin import pinyin 二.pypinyin库的使用

  • Java汉字转拼音类库Pinyin4j详细使用方法与实例

    汉字转拼音类库Pinyin4j一般用法 pinyin4j的使用很方便,一般转换只需要使用PinyinHelper类的静态工具方法即可: String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('刘'); //该类还有其他的拼音转换形式,但是基本上用不到,就不介绍了 返回的数组即是该字符的拼音,如上例就是pinyin[0]=liu2,后面的数字代表声调,声调为5表示轻读,无声调.之所谓返回数组,是因为被判定的汉字有可能有多个读音.如果输入的参

  • MySQL按照汉字的拼音排序简单实例

    如果存储姓名的字段采用的是GBK字符集,那就好办了,因为GBK内码编码时本身就采用了拼音排序的方法(常用一级汉字3755个采用拼音排序,二级汉字就不是了,但考虑到人名等都是常用汉字,因此只是针对一级汉字能正确排序也够用了). 直接在查询语句后面 添加 order by name asc; 查询结果按照姓氏的升序排序: 如果存储姓名的字段采用的是 utf8字符集,需要在排序的时候对字段进行转码:对于的代码是  order by convert(name using gbk) asc; 同样,查询的

  • Java中汉字转拼音pinyin4j用法实例分析

    本文实例讲述了Java中汉字转拼音pinyin4j用法.分享给大家供大家参考,具体如下: 汉字转换拼音在日常开发中是个很常见的问题.例如我们伟大的12306,在地名中输入"WH",就会出现"武汉""芜湖""威海"等地名,输入"WUHU"就会出现"芜湖". Java获取汉字的拼音,pinyin4j这个库可以很好的解决这个问题. 下载地址:http://sourceforge.net/pro

  • Yii2汉字转拼音类的实例代码

    类核心代码: <?php namespace mobile\models; use Yii; use yii\base\Model; /** * 汉字转拼音 * @property integer */ class SpellModel extends Model { /** * 拼音字符转换图 * @var array */ private static $_aMaps = array( 'a'=>-20319,'ai'=>-20317,'an'=>-20304,'ang'=&g

  • PHP基于自定义函数实现的汉字转拼音功能实例

    本文实例讲述了PHP基于自定义函数实现的汉字转拼音功能.分享给大家供大家参考,具体如下: 整个过程用到了pinyin.table文件. pinyin.php <?php header("Content-Type:text/html;charset=utf-8"); $letters = ""; if ($_GET) { $cat_name = $_GET["cat_name"]; $catname = convert($cat_name);

  • Java 实现汉字转换为拼音的实例

    Java 实现汉字转换为拼音 转换类 public class PINYINChinese { private static int[] pyvalue = new int[] { -20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036, -20032, -20026, -20002, -19990, -19986, -19982, -19976, -19805,

随机推荐