C# 真正完美的 汉字转拼音

 更新时间:2020年5月27日 14:02  点击:1756

网上有很多说自己整理的汉字转拼音是完美的,但使用后才发现都是半吊的瓶子,问题多多。

常见的生僻字,或多音字识别,转换后简直让人感觉可怕。

主流的转换有三种:hash匹配,Npinyin,微软PinYinConverter。

但单用这三个,都没法做到完美,为什么没人考虑融合呢?

我的方案:Npinyin+微软PinYinConverter(首选Npinyin)

微软PinYinConverter

为什么:微软PinYinConverter很强大,但在多音字面前,犯了传统的错误,按拼音字母排序。如【强】微软居然优先【jiang】而不是】【qiang】

所以不能优选 PinYinConverter。

Npinyin

很人性,很不错的第三方库,在传统多音字前优先使用率较高的,但在生僻字面前有点无法转换。(GetInitials(strChinese)  有Bug  如【洺】无法识别,但GetPinyin可以正常转换。)

总结:优先Npinyin  翻译失败的使用微软PinYinConverter。目测完美。

上代码:

public class PingYinHelper
    {private static Encoding gb2312 = Encoding.GetEncoding("GB2312");/// <summary>/// 汉字转全拼/// </summary>/// <param name="strChinese"></param>/// <returns></returns>public static string ConvertToAllSpell(string strChinese)
        {try{if (strChinese.Length != 0)
                {
                    StringBuilder fullSpell = new StringBuilder();for (int i = 0; i < strChinese.Length; i++)
                    {var chr = strChinese[i];
                        fullSpell.Append(GetSpell(chr));
                    }return fullSpell.ToString().ToUpper();
                }
            }catch (Exception e)
            {
                Console.WriteLine("全拼转化出错!" + e.Message);
            }return string.Empty;
        }/// <summary>/// 汉字转首字母/// </summary>/// <param name="strChinese"></param>/// <returns></returns>public static string GetFirstSpell(string strChinese)
        {//NPinyin.Pinyin.GetInitials(strChinese)  有Bug  洺无法识别//return NPinyin.Pinyin.GetInitials(strChinese);try{if (strChinese.Length != 0)
                {
                    StringBuilder fullSpell = new StringBuilder();for (int i = 0; i < strChinese.Length; i++)
                    {var chr = strChinese[i];
                        fullSpell.Append(GetSpell(chr)[0]);
                    }return fullSpell.ToString().ToUpper();
                }
            }catch (Exception e)
            {
                Console.WriteLine("首字母转化出错!" + e.Message);
            }return string.Empty;
        }private static string GetSpell(char chr)
        {var coverchr = NPinyin.Pinyin.GetPinyin(chr);bool isChineses = ChineseChar.IsValidChar(coverchr[0]);if (isChineses)
            {
                ChineseChar chineseChar = new ChineseChar(coverchr[0]);foreach (string value in chineseChar.Pinyins)
                {if (!string.IsNullOrEmpty(value))
                    {return value.Remove(value.Length - 1, 1);
                    }
                }
            }return coverchr;

        }
    }


抽了几个常见错字和姓名

测试如下:

 [TestMethod]public void PingyinTest()
        {
            Dictionary<string, Tuple<string, string>> dict = newDictionary<string, Tuple<string, string>>() {
            {"梅钰", new Tuple<string,string>( "meiyu","MY")},
            {"张洺", new Tuple<string,string>( "zhangming","ZM")},
            {"王玥", new Tuple<string,string>( "wangyue","WY")},
            {"王思琪", new Tuple<string,string>( "wangsiqi","WSQ")},
            {"董云强", new Tuple<string,string>( "dongyunqiang","DYQ")},
            {"宋红培", new Tuple<string,string>( "songhongpei","SHP")},
            {"石磊", new Tuple<string,string>( "shilei","SL")},
            };foreach (var keyval in dict)
            {var name = keyval.Key;var spell1 = keyval.Value.Item1;var spell2 = keyval.Value.Item2;var val = ChineseSpell.ConvertToAllSpell(name).TrimAll();

                val = FlexLogicFramework.Library.CommonLib.PingYinHelper.ConvertToAllSpell(name)
                    .TrimAll().ToLower();

                Assert.IsTrue(val == spell1, "转换错误");

                val = FlexLogicFramework.Library.CommonLib.ChineseSpell.GetFirstSpell(name).TrimAll();

                val = FlexLogicFramework.Library.CommonLib.PingYinHelper.GetFirstSpell(name).TrimAll();

                Assert.IsTrue(val == spell2, "转换错误");
            }

        }


[!--infotagslink--]

相关文章

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

    这篇文章介绍了C# 汉字转拼音(全拼和首字母)实例代码,有需要的朋友可以参考一下...2020-06-25
  • C#实现汉字转拼音或转拼音首字母的方法

    这篇文章主要介绍了C#实现汉字转拼音或转拼音首字母的方法,涉及C#操作数组、遍历及正则匹配的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 汉字转拼音实例(支持GB2312字符集中所有汉字)

    本篇文章主要介绍了C# 汉字转拼音实例(支持GB2312字符集中所有汉字) ,非常具有实用价值,需要的朋友可以参考下。...2020-06-25
  • 取得拼音字头的存储过程

    -- ============================================= -- Create scalar function (NWGetPYFirst) -- ============================================= IF EXISTS (SELE...2016-11-25
  • C# 汉字转化拼音的简单实例代码

    C# 汉字转化拼音的简单实例代码,需要的朋友可以参考一下...2020-06-25
  • C#获取汉字字符串拼音首字母的方法

    这篇文章主要介绍了C#获取汉字字符串拼音首字母的方法,实例分析了C#操作汉字及字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 拼音码表的生成

    <?php /** 拼音码表的生成: 启动输入法生成器在逆转换选项卡中装入window的拼音输入法并将其保存为文 本文件(winpy.txt)备用。 下面的代码将拼音码表文件(文本)装入到...2016-11-25
  • 汉字转拼音缩写示例代码(Silverlight和.NET 将汉字转换成为拼音)

    本篇文章主要介绍了汉字转拼音缩写示例代码(Silverlight和.NET 将汉字转换成为拼音) 需要的朋友可以过来参考下,希望对大家有所帮助...2020-06-25
  • ASP.NET Core使用微软官方类库实现汉字转拼音

    这篇文章主要为大家详细介绍了ASP.NET Core使用微软官方类库实现汉字转拼音,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • c# 中文转拼音without CJK

    本文主要介绍了中文转拼音without CJK,文章篇尾附上源码下载。具有一定的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • MySQL按照汉字的拼音排序简单实例

    下面小编就为大家带来一篇MySQL按照汉字的拼音排序简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-01-22
  • ASP.NET 根据汉字获取汉字拼音的首字母(含多音字)

    本文分享了一个函数,这个函数可以根据汉字的字符串获取其拼音的首字母,以便我们在实际开发中使用。...2021-09-22
  • PHP汉字转换拼音的函数代码

    这篇文章主要介绍了PHP汉字转换拼音的函数代码,php将汉字转换成拼音,感兴趣的小伙伴们可以参考一下...2016-01-02
  • 基于PHP如何把汉字转化为拼音

    将汉字转化为拼音是程序员们经常用到的操作任务之一,大家还经常见到ios 将汉字转化为拼音、excel汉字转化成拼音、excel汉字转化为拼音等,本文通过一段代码实例给大家介绍基于PHP如何把汉字转化为拼音,感兴趣的朋友一起学习吧...2015-12-14
  • C#汉字转拼音实例(支持多音字)

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

    这篇文章主要介绍了php实现数组按拼音顺序排序的方法,涉及php汉字与拼音的转换及数组遍历、排序相关操作技巧,需要的朋友可以参考下...2017-05-08
  • PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法

    这篇文章主要介绍了PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法,结合实例形式分析了ICU扩展intl的实现方法与拼音转换、排序等相关操作技巧,需要的朋友可以参考下...2017-05-08
  • ASP.NET汉字转拼音 - 输入汉字获取其拼音的具体实现

    这篇文章主要介绍了ASP.NET汉字转拼音 - 输入汉字获取其拼音的具体实现,需要的朋友可以参考下...2021-09-22
  • php汉字转拼音

    <?php $d=array( array("a",-20319), array("ai",-20317), array("an",-20304), array("ang",-20295), array("ao",-20292), array("ba",-20283), array("bai...2016-11-25
  • php超级功能,汉字转拼音

    <?php $d=array( array("a",-20319), array("ai",-20317), array("an",-20304), array("ang",-20295), array("ao",-20292), array("ba",-20283), array("...2016-11-25