.net汉字转字母
目前手上有一个需要实现:将用户输入的姓名转换成汉语拼音。
使用枚举,既麻烦又易出错,发现有一个微软拼音转换工具类ChnCharInfo.dll,在此记录下:
首先需要引入此dll,
链接: http://pan.baidu.com/s/1hsa9Y40 密码: ijdi
写一个转换的Helper类:
public class ChineseToCharHelper { /// <summary>得到汉字拼音(Item1:全拼 2:首字母缩写 3:大写开头全拼)</summary> /// <param name="chinese"></param> /// <returns></returns> public static Tuple<string, string, string> PinYinString(string chinese) { if (string.IsNullOrWhiteSpace(chinese)) return new Tuple<string, string, string>(string.Empty, string.Empty, string.Empty); char[] ch = chinese.ToArray(); string allPinYin = string.Empty, abbPinYin = string.Empty, firstAllPinYin = string.Empty; foreach (char c in ch) { if (ChineseChar.IsValidChar(c)) { ChineseChar chineseChar = new ChineseChar(c); ReadOnlyCollection<string> pinyin = chineseChar.Pinyins; var duoyinList = pinyin.Where(x => !string.IsNullOrWhiteSpace(x)).Select(x => x.Length >= 1 ? x.Substring(0, x.Length - 1).ToLower() : string.Empty).ToList(); var dic = duoyinList.GroupBy(x => x).ToDictionary(x => x.Key, y => y.Count()).OrderByDescending(x => x.Value); if (dic.Any()) { if (dic.First().Value.Equals(1)) { abbPinYin += pinyin[0] != null && pinyin[0].Length >= 1 ? pinyin[0].Substring(0, 1) : string.Empty; allPinYin += pinyin[0] != null && pinyin[0].Length > 1 ? pinyin[0].Substring(0, pinyin[0].Length - 1) : pinyin[0] != null && pinyin[0].Length.Equals(1) ? pinyin[0].Substring(0, 1) : string.Empty; var temp = pinyin[0] != null && pinyin[0].Length > 1 ? pinyin[0].Substring(0, pinyin[0].Length - 1) : pinyin[0] != null && pinyin[0].Length.Equals(1) ? pinyin[0].Substring(0, 1) : string.Empty; firstAllPinYin += System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(temp.ToLower()); } else { var value = dic.First().Key; abbPinYin += value.Length >= 1 ? value.Substring(0, 1) : string.Empty; allPinYin += value; firstAllPinYin += System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(value.ToLower()); } } } else { abbPinYin += c.ToString(); allPinYin += c.ToString(); firstAllPinYin += System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(c.ToString().ToLower()); } } return new Tuple<string, string, string>(allPinYin.ToLower(), abbPinYin.ToLower(), firstAllPinYin); } }
直接调用就可以啦。
但是,组件存在BUG:
就像图中显示的样子,“汤” ,转换后的拼音是错误的。
其他的汉字转化吗,到还有发现。毕竟少数,特殊处理下就可以了,组件还是可用的。
作者:Eric Li
出处:http://www.cnblogs.com/ericli-ericli/
除转载文章外,随笔版权归作者和博客园所有,欢迎转载,转载请标明出处。
如果您觉得本篇博文对您有所收获,觉得作者还算用心,请点击右下角的 [推荐],谢谢!