生成拼音

Posted nanfei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成拼音相关的知识,希望对你有一定的参考价值。

void Main()
{
    var index = 0;
    var count = CM_BookPages.Count(p=>p.PinYin == null || p.PinYin == "");
    this.Connection.Open();
    foreach (var page in CM_BookPages.Where(p=>p.PinYin == null || p.PinYin == "").ToList())
    {
        var pinYin = string.Join(",",PinYinHelper.GetAllPinYinForChineseSentence(page.Title));
        var sql = string.Format( "UPDATE CM_BookPage SET PinYin = ‘{0}‘ WHERE PageID = {1};", pinYin,page.PageID);
        var cmd = this.Connection.CreateCommand();
        cmd.CommandTimeout = 0;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = sql;
        var r = cmd.ExecuteNonQuery();
        
        index += r;
        if(index % 100 ==0)
            (index.ToString() + "/" + count.ToString()).Dump();
    }
    
    this.Connection.Close();
    
    "over".Dump();
}

public static class PinYinHelper
{
    private static Dictionary<KeyValuePair<char, int>, char> toneChars = new Dictionary<KeyValuePair<char, int>, char>();

    private static void InitToneChars()
    {
        toneChars.Add(new KeyValuePair<char, int>(a, 1), ā);
        toneChars.Add(new KeyValuePair<char, int>(a, 2), á);
        toneChars.Add(new KeyValuePair<char, int>(a, 3), ǎ);
        toneChars.Add(new KeyValuePair<char, int>(a, 4), à);
        toneChars.Add(new KeyValuePair<char, int>(a, 5), a);
        toneChars.Add(new KeyValuePair<char, int>(o, 1), ō);
        toneChars.Add(new KeyValuePair<char, int>(o, 2), ó);
        toneChars.Add(new KeyValuePair<char, int>(o, 3), ǒ);
        toneChars.Add(new KeyValuePair<char, int>(o, 4), ò);
        toneChars.Add(new KeyValuePair<char, int>(o, 5), o);
        toneChars.Add(new KeyValuePair<char, int>(e, 1), ē);
        toneChars.Add(new KeyValuePair<char, int>(e, 2), é);
        toneChars.Add(new KeyValuePair<char, int>(e, 3), ě);
        toneChars.Add(new KeyValuePair<char, int>(e, 4), è);
        toneChars.Add(new KeyValuePair<char, int>(e, 5), e);
        toneChars.Add(new KeyValuePair<char, int>(i, 1), ī);
        toneChars.Add(new KeyValuePair<char, int>(i, 2), í);
        toneChars.Add(new KeyValuePair<char, int>(i, 3), ǐ);
        toneChars.Add(new KeyValuePair<char, int>(i, 4), ì);
        toneChars.Add(new KeyValuePair<char, int>(i, 5), i);
        toneChars.Add(new KeyValuePair<char, int>(u, 1), ū);
        toneChars.Add(new KeyValuePair<char, int>(u, 2), ú);
        toneChars.Add(new KeyValuePair<char, int>(u, 3), ǔ);
        toneChars.Add(new KeyValuePair<char, int>(u, 4), ù);
        toneChars.Add(new KeyValuePair<char, int>(u, 5), u);
        toneChars.Add(new KeyValuePair<char, int>(v, 1), ǖ);
        toneChars.Add(new KeyValuePair<char, int>(v, 2), ǘ);
        toneChars.Add(new KeyValuePair<char, int>(v, 3), ǚ);
        toneChars.Add(new KeyValuePair<char, int>(v, 4), ǜ);
        toneChars.Add(new KeyValuePair<char, int>(v, 5), ü);
    }

    static PinYinHelper()
    {
        InitToneChars();
    }

    private static string GetTonePinYin(string jianPin, int tone)
    {
        jianPin = jianPin.ToLower();

        var chars = new char[] { a, e, i, o, u, v };
        foreach (var c in chars)
        {
            var p = jianPin.LastIndexOf(c);
            if (p < 0)
                continue;

            var toneKey = new KeyValuePair<char, int>(c, tone);
            return jianPin.Substring(0, p) + toneChars[toneKey] + jianPin.Substring(p + 1);
        }

        return string.Empty;
    }

    public static string GetPinYinForChineseWord(char c)
    {
        if (!ChineseChar.IsValidChar(c))
            return string.Empty;

        ChineseChar chineseChar = new ChineseChar(c);
        var pinYin = chineseChar.Pinyins[0];
        return GetTonePinYin(pinYin.Substring(0, pinYin.Length - 1), int.Parse(pinYin.Last().ToString()));
    }

    public static List<string> GetPinYinListForChineseWord(char c)
    {
        if (!ChineseChar.IsValidChar(c))
            return new List<string>() {" "};

        var result = new List<string>();
        var chineseChar = new ChineseChar(c);
        for (var i = 0; i < chineseChar.PinyinCount; i++)
        {
            var item = chineseChar.Pinyins[i];
            var pinYin = item.Substring(0, item.Length - 1);
            result.Add(pinYin.ToLower());
        }
        return result.Distinct().ToList();
    }

    public static string GetPinYinForChineseSentence(string text)
    {
        var sb = new StringBuilder();
        foreach (var c in text)
            sb.Append(GetPinYinForChineseWord(c)).Append(" ");
        return sb.ToString();
    }
    
    public static List<string> GetAllPinYinForChineseSentence(string text)
    {
        var charPinYins = new List<List<string>>();
        foreach (var c in text)
            charPinYins.Add(GetPinYinListForChineseWord(c).Select(item=>item.Replace(" ",string.Empty)).ToList());
        return GetAllSentencePinYin(charPinYins);
    }

    public static char GetFirstWordPinYinChar(string text)
    {
        var result =  ;

        try
        {
            text = text.Trim();
            if (text.Length < 1)
                return result;

            var c = text[0];
            ChineseChar chineseChar = new ChineseChar(c);
            if (chineseChar.PinyinCount < 1)
                return c;

            if (chineseChar.Pinyins[0].Length < 1)
                return c;

            return chineseChar.Pinyins[0][0];
        }
        catch
        {
            return result;
        }
    }
    
    public static List<string> GetAllSentencePinYin(List<List<string>> wordPinYinList)
    {
        if (wordPinYinList.Count == 0)
            return new List<string> { string.Empty };

        if (wordPinYinList.Count == 1)
            return wordPinYinList[0];
            
        var itemsLeft = wordPinYinList[0];
        var itemsRight = GetAllSentencePinYin(wordPinYinList.Skip(1).ToList());
        var query = from a in itemsLeft join b in itemsRight on 1 equals 1 select a + b;
        return query.ToList();
    }
}

 

以上是关于生成拼音的主要内容,如果未能解决你的问题,请参考以下文章

js中如何根据汉字生成拼音首字母

postman 自动生成 curl 代码片段

postman 自动生成 curl 代码片段

生成sqlserver拼音码

Apollo Codegen 没有找到生成代码的操作或片段

前端开发工具vscode如何快速生成代码片段