任何将数字拼音转换为带声调标记的拼音的库

本文关键字:声调 数字 转换 任何 | 更新日期: 2023-09-27 17:57:47

只是想知道有没有人知道一个类库可以将汉语拼音转换为带声调的拼音,比如nin2 hao3 ma到nín hāo ma。它与这个答案类似,但希望使用.NET框架。

任何将数字拼音转换为带声调标记的拼音的库

这是我将@Greg Hewgill python算法移植到C#的过程。到目前为止,我还没有遇到任何问题。

public static string ConvertNumericalPinYinToAccented(string input)
    {
        Dictionary<int, string> PinyinToneMark = new Dictionary<int, string>
        {
            {0, "aoeiuv'u00fc"},
            {1, "'u0101'u014d'u0113'u012b'u016b'u01d6'u01d6"},
            {2, "'u00e1'u00f3'u00e9'u00ed'u00fa'u01d8'u01d8"},
            {3, "'u01ce'u01d2'u011b'u01d0'u01d4'u01da'u01da"},
            {4, "'u00e0'u00f2'u00e8'u00ec'u00f9'u01dc'u01dc"}
        };
        string[] words = input.Split(' ');
        string accented = "";
        string t = "";
        foreach (string pinyin in words)
        {
            foreach (char c in pinyin)
            {
                if (c >= 'a' && c <= 'z')
                {
                    t += c;
                }
                else if (c == ':')
                {
                    if (t[t.Length - 1] == 'u')
                    {
                        t = t.Substring(0, t.Length - 2) + "'u00fc";
                    }
                }
                else
                {
                    if (c >= '0' && c <= '5')
                    {
                        int tone = (int)Char.GetNumericValue(c) % 5;
                        if (tone != 0)
                        {
                            Match match = Regex.Match(t, "[aoeiuv'u00fc]+");
                            if (!match.Success)
                            {
                                t += c;
                            }
                            else if (match.Groups[0].Length == 1)
                            {
                                t = t.Substring(0, match.Groups[0].Index) +
                                    PinyinToneMark[tone][PinyinToneMark[0].IndexOf(match.Groups[0].Value[0])]
                                    + t.Substring(match.Groups[0].Index + match.Groups[0].Length);
                            }
                            else
                            {
                                if (t.Contains("a"))
                                {
                                    t = t.Replace("a", PinyinToneMark[tone][0].ToString());
                                }
                                else if (t.Contains("o"))
                                {
                                    t = t.Replace("o", PinyinToneMark[tone][1].ToString());
                                }
                                else if (t.Contains("e"))
                                {
                                    t = t.Replace("e", PinyinToneMark[tone][2].ToString());
                                }
                                else if (t.Contains("ui"))
                                {
                                    t = t.Replace("i", PinyinToneMark[tone][3].ToString());
                                }
                                else if (t.Contains("iu"))
                                {
                                    t = t.Replace("u", PinyinToneMark[tone][4].ToString());
                                }
                                else
                                {
                                    t += "!";
                                }
                            }
                        }
                    }
                    accented += t;
                    t = "";
                }
            }
            accented += t + " ";
        }
        accented = accented.TrimEnd();
        return accented;
    }

我使用过Microsoft Visual Studio International Pack。

这是1.0版本。以及功能包2.0。

希望能帮助你!

我认为这条线是

t = t.Substring(0, t.Length - 2) + "'u00fc";

应该是这个

t = t.Substring(0, t.Length - 1) + "'u00fc";