C#实现汉字转汉语拼音的示例代码

作者:Dwaynerbing 时间:2022-08-05 14:04:53 

一、使用PinYinConverterCore获取汉语拼音

最新在做一个搜索组件,需要使用汉语拼音的首字母查询出符合条件的物品名称,由于汉字存在多音字,所以自己写查询组件不太现实,因此,我们使用微软提供的CHSPinYinConvCHSPinYinConv在.net core下载安装没有问题,但在.net framework会由于兼容性会安装失败,因此使用了PinYinConverterCore来实现汉字转拼音,PinYinConverterCore应该也是基于CHSPinYinConv开发的兼容包,后续的代码两个安装包环境下都可以使用。使用Nuget搜索PinYinConverterCore下载并安装,具体如下:

C#实现汉字转汉语拼音的示例代码

二、编写工具扩展类实现获取汉字的拼音

由于汉字存在多音字,因此,通过汉字获取到的拼音是一个数组,具体如下:

/// <summary>
   /// 汉字转换拼音
   /// </summary>
   public static class PingYinUtil
   {
       private static Dictionary<int, List<string>> GetTotalPingYinDictionary(string text)
       {
           var chs = text.ToCharArray();

//记录每个汉字的全拼
           Dictionary<int, List<string>> totalPingYinList = new Dictionary<int, List<string>>();

for (int i = 0; i < chs.Length; i++)
           {
               var pinyinList = new List<string>();

//是否是有效的汉字
               if (ChineseChar.IsValidChar(chs[i]))
               {
                   ChineseChar cc = new ChineseChar(chs[i]);
                   pinyinList = cc.Pinyins.Where(p => !string.IsNullOrWhiteSpace(p)).ToList();
               }
               else
               {
                   pinyinList.Add(chs[i].ToString());
               }

//去除声调,转小写
               pinyinList = pinyinList.ConvertAll(p => Regex.Replace(p, @"\d", "").ToLower());

//去重
               pinyinList = pinyinList.Where(p => !string.IsNullOrWhiteSpace(p)).Distinct().ToList();
               if (pinyinList.Any())
               {
                   totalPingYinList[i] = pinyinList;
               }
           }

return totalPingYinList;
       }
       /// <summary>
       /// 获取汉语拼音全拼
       /// </summary>
       /// <param name="text">The string.</param>
       /// <returns></returns>
       public static List<string> GetTotalPingYin(this string text)
       {
           var result = new List<string>();
           foreach (var pys in GetTotalPingYinDictionary(text))
           {
               var items = pys.Value;
               if (result.Count <= 0)
               {
                   result = items;
               }
               else
               {
                   //全拼循环匹配
                   var newTotalPingYinList = new List<string>();
                   foreach (var totalPingYin in result)
                   {
                       newTotalPingYinList.AddRange(items.Select(item => totalPingYin + item));
                   }
                   newTotalPingYinList = newTotalPingYinList.Distinct().ToList();
                   result = newTotalPingYinList;
               }
           }
           return result;
       }

/// <summary>
       /// 获取汉语拼音首字母
       /// </summary>
       /// <param name="text"></param>
       /// <returns></returns>
       public static List<string> GetFirstPingYin(this string text)
       {
           var result = new List<string>();
           foreach (var pys in GetTotalPingYinDictionary(text))
           {
               var items = pys.Value;
               if (result.Count <= 0)
               {
                   result = items.ConvertAll(p => p.Substring(0, 1)).Distinct().ToList();
               }
               else
               {
                   //首字母循环匹配
                   var newFirstPingYinList = new List<string>();
                   foreach (var firstPingYin in result)
                   {
                       newFirstPingYinList.AddRange(items.Select(item => firstPingYin + item.Substring(0, 1)));
                   }
                   newFirstPingYinList = newFirstPingYinList.Distinct().ToList();
                   result = newFirstPingYinList;
               }
           }
           return result;
       }
   }

三、编写测试用例

我们编写一个测试用例,通过输入的汉字获取到汉语拼音的全拼和首字母缩写,具体如下:

// 汉字输入
string text = TextBoxInput.Text;

// 获取到汉语拼音的全拼
TextBoxTotal.Text = string.Join(",", text.GetTotalPingYin());

// 获取到汉语拼音的首字母
TextBoxFirst.Text = string.Join(",", text.GetFirstPingYin());

C#实现汉字转汉语拼音的示例代码

我们编写录入一组用户名,然后根据输入输入的用户名的缩写,筛选出符合条件的人,我们可以使用Linq模糊查询,具体如下:

public class Student
   {
       public string Name { get; set; }
       public List<string> Pinyin { get; set; }
   }
StudentList = new List<Student>
           {
               new Student() {Name = "张三"},
               new Student() {Name = "章黎"},
               new Student() {Name = "张三丰"},
               new Student() {Name = "李四"},
               new Student() {Name = "王五"},
               new Student() {Name = "John"},
               new Student() {Name = "W.吴"},
               new Student() {Name = "阿姨"},
               new Student() {Name = "阿胶"},
               new Student() {Name = "麦合苏提.麦合苏提"}
           };
var text = TextBoxSearch.Text;
           foreach (var student in StudentList)
           {
               student.Pinyin = student.Name.GetFirstPingYin();
           }

StudentList = StudentList.Where(s => s.Pinyin.Exists(p=>p.Contains(text))).ToList();

C#实现汉字转汉语拼音的示例代码

来源:https://www.cnblogs.com/dongweian/p/15715099.html

标签:C#,汉字,拼音
0
投稿

猜你喜欢

  • Java反射机制深入理解

    2022-11-24 14:58:14
  • C# 程序集和反射详解

    2022-12-29 20:24:18
  • 基于C#的音乐播放器主Form实现代码

    2022-07-13 01:21:36
  • java多线程并发中使用Lockers类将多线程共享资源锁定

    2021-11-14 11:08:37
  • Java实现按权重随机数

    2023-11-28 23:15:32
  • spring boot如何使用AOP统一处理web请求

    2023-05-16 14:15:11
  • C#实现简单获取及设置Session类

    2021-07-09 06:19:27
  • Java单例模式的线程安全,饿汉和懒汉模式详解

    2022-05-31 16:12:08
  • Java字节码ByteBuddy使用及原理解析上

    2023-08-23 19:33:05
  • 举例讲解Java中Piped管道输入输出流的线程通信控制

    2021-06-25 14:19:58
  • springboot vue前后端接口测试树结点添加功能

    2022-05-22 18:51:09
  • Java如何跳过https的ssl证书验证详解

    2023-08-24 11:34:56
  • Android实现购物车及其他功能的角标

    2021-12-24 10:54:54
  • Java实现批量下载(打包成zip)的实现

    2022-04-02 01:53:05
  • 分享安装Android Studio3.6的经验教训

    2021-12-24 07:39:29
  • 关于ObjectUtils.isEmpty() 和 null 的区别

    2022-05-07 17:10:56
  • Java实现分页的前台页面和后台代码

    2021-07-22 17:10:04
  • Android实现屏幕旋转四个方向准确监听

    2022-06-07 08:57:32
  • 如何在MyBatis中实现DataSource

    2021-11-29 13:49:48
  • Java接口返回json如何忽略特定属性

    2022-03-16 07:54:24
  • asp之家 软件编程 m.aspxhome.com