博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 真正完美的 汉字转拼音
阅读量:7287 次
发布时间:2019-06-30

本文共 4045 字,大约阅读时间需要 13 分钟。

 

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

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

主流的转换有三种: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");        ///         /// 汉字转全拼        ///         ///         /// 
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; } /// /// 汉字转首字母 /// /// ///
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
> dict = new Dictionary
>() { {"梅钰", new Tuple
( "meiyu","MY")}, {"张洺", new Tuple
( "zhangming","ZM")}, {"王玥", new Tuple
( "wangyue","WY")}, {"王思琪", new Tuple
( "wangsiqi","WSQ")}, {"董云强", new Tuple
( "dongyunqiang","DYQ")}, {"宋红培", new Tuple
( "songhongpei","SHP")}, {"石磊", new Tuple
( "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, "转换错误"); } }
 
 
 
转至:https://www.cnblogs.com/shikyoh/p/6270026.html

转载于:https://www.cnblogs.com/fannyatg/p/9167838.html

你可能感兴趣的文章
父传子,关于清楚子组件提交之后页面的数据
查看>>
Java 命令行交互输入库 JLine 入门
查看>>
举个栗子看如何做MySQL 内核深度优化
查看>>
asp.net 虹软 人脸识别 实现刷脸住宿、刷脸签到、刷脸进入等
查看>>
tomcat服务器输入localhost可以访问,ip无法访问解决办法
查看>>
js 实现异步上传图片+预览
查看>>
Java 趣史-差点把 Java 命名成了 Silk(丝绸)
查看>>
死磕 java集合之ConcurrentLinkedQueue源码分析
查看>>
ubuntu安装sun jdk6
查看>>
phalapi-入门篇4(国际化高可用和自动生成文档)
查看>>
xcode报错集锦_1
查看>>
hadoop-mapreduce分析
查看>>
多线程学习(4)wait/notify
查看>>
OSChina 周五乱弹——让人伤心的事
查看>>
Golang配置
查看>>
android下拉刷新
查看>>
linux 中route命令的使用
查看>>
ArrayList既然继承自AbstractList抽象类,而AbstractList已经实现了List接口,那么ArrayList类为何还要再实现List接口呢?...
查看>>
CentOS安装Redis
查看>>
在iOS上实现一个简单的日历控件
查看>>