微软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