2011-05-28 66 views

回答

1

我已经使用了Microsoft Visual Studio国际包。

这是1.0 version.Feature Pack 2.0

希望能帮到你!

+0

@贾斯汀:你会介意给个例子吗?在帮助文件(或任何少数代码示例)中没有任何提及,我发现它显示了是否可以在数字拼音和单音拼音之间进行转换。 – LittleTiger 2012-08-21 10:56:23

2

这里是我将@ Greg-Hewgill python algorithm移植到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; 
    } 
0

我觉得这条线

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

应该是这个,而不是

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

我认为这是作为评论http://stackoverflow.com/a/20106483/6872499 – silentsod 2017-01-25 17:05:52