微软PinYinConverter
微软PinYinConverter很强大,但在多音字面前,犯了传统的错误,按拼音字母排序。如【强】微软居然优先【jiang】而不是】【qiang】
所以不能优选 PinYinConverter。
Npinyin
开源项目:http://code.google.com/p/npinyin/
很人性,很不错的第三方库,在传统多音字前优先使用率较高的,但在生僻字面前有点无法转换。(GetInitials(strChinese) 有Bug 如【洺】无法识别,但GetPinyin可以正常转换。)
所以优先Npinyin 翻译失败的使用微软PinYinConverter。
Npinyin+微软PinYinConverter两种方式结合转换,能达到比较完美的转换效果。
当然,如果有多音字,那也会有些问题,因为就算是人也不一定知道到底是读哪个音,何况是程序呢?
/* * 目前最完美的中文转拼音项目,开源项目:https://code.google.com/archive/p/npinyin/ */ class Program { static void Main(string[] args) { string[] maxims = new string[] { "事常与人违,事总在人为", "骏马是跑出来的,强兵是打出来的", "驾驭命运的舵是奋斗。不抱有一丝幻想,不放弃一点机会,不停止一日努力。 ", "如果惧怕前面跌宕的山岩,生命就永远只能是死水一潭", "懦弱的人只会裹足不前,莽撞的人只能引为烧身,只有真正勇敢的人才能所向披靡" }; Console.WriteLine("UTF8句子拼音:"); foreach (string s in maxims) { Console.WriteLine("汉字:{0} 拼音:{1} ", s, Pinyin.GetPinyin(s)); } //string[] medicines = new string[] { // "聚维酮碘溶液", // "开塞露", // "炉甘石洗剂", // "苯扎氯铵贴", // "鱼石脂软膏", // "莫匹罗星软膏", // "红霉素软膏", // "氢化可的松软膏", // "曲安奈德软膏", // "丁苯羟酸乳膏", // "双氯芬酸二乙胺乳膏", // "冻疮膏", // "克霉唑软膏", // "特比奈芬软膏", // "酞丁安软膏", // "咪康唑软膏、栓剂", // "甲硝唑栓", // "复方莪术油栓" // }; //Encoding gb2312 = Encoding.GetEncoding("GB2312"); //Console.WriteLine("GB2312拼音简码:"); //foreach (string m in medicines) //{ // string s = Pinyin.ConvertEncoding(m, Encoding.UTF8, gb2312); // Console.WriteLine("药品:{0} 简码:{1} ", s, Pinyin.GetInitials(s, gb2312)); //} var name = "虞晟旻"; //Console.WriteLine("汉字:{0} 拼音:{1} ", name, Pinyin.GetPinyin(name)); Console.WriteLine("汉字:{0} 拼音:{1} ", name, pinyinHelper.ConvertToAllSpell(name)); Console.ReadKey(); } } public class pinyinHelper { /// <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)).Append(" "); } 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; } }
效果:
npinyin开源项目:
demo下载:NPinyinTest.zip