Esempio n. 1
0
 /// <summary>
 /// 获取汉字的拼音数组
 /// </summary>
 /// <param name="hanzi">要查询拼音的汉字字符</param>
 /// <returns>汉字的拼音数组,若未找到汉字拼音,则返回空数组</returns>
 /// <exception cref="UnsupportedUnicodeException">当要获取拼音的字符不是汉字时抛出此异常</exception>
 public static string[] GetPinyin(char hanzi)
 {
     if (PinyinUtil.IsHanzi(hanzi))
     {
         return(PinyinDB.Instance.GetPinyin(hanzi));
     }
     // 不是汉字
     throw new UnsupportedUnicodeException("不支持的字符: 请输入汉字");
 }
Esempio n. 2
0
        /// <summary>
        /// 获取一个字符串内所有汉字的拼音(多音字取第一个读音,带格式)
        /// </summary>
        /// <param name="text">要获取拼音的汉字字符串</param>
        /// <param name="format">拼音输出格式化参数</param>
        /// <param name="caseSpread">是否将前面的格式中的大小写扩展到其它非拼音字符,默认为false。firstLetterOnly为false时有效 </param>
        /// <param name="pinyinHandler">
        /// 拼音处理器,在获取到拼音后通过这个来处理,
        /// 如果传null,则默认取第一个拼音(多音字),
        /// 参数:
        /// 1 string[] 拼音数组
        /// 2 char 当前的汉字
        /// 3 string 要转成拼音的字符串
        /// return 拼音字符串,这个返回值将作为这个汉字的拼音放到结果中
        /// </param>
        /// <returns>firstLetterOnly为true时,只取拼音首字母格式为[L],后面追加空格;multiFirstLetter为true时,多音字的多个拼音首字母格式为[L, H],后面追加空格</returns>
        public static string GetPinyin(string text, PinyinOutputFormat format, bool caseSpread, Func <string[], char, string, string> pinyinHandler)
        {
            if (string.IsNullOrEmpty(text))
            {
                return("");
            }

            var pinyin         = new StringBuilder();
            var firstLetterBuf = new List <string>();

            foreach (var item in text)
            {
                if (!PinyinUtil.IsHanzi(item))
                {
                    pinyin.Append(item);
                    continue;
                }

                var pinyinTemp = PinyinDB.Instance.GetPinyin(item);

                pinyin.Append(pinyinHandler == null ?
                              pinyinTemp[0] :
                              pinyinHandler.Invoke(pinyinTemp, item, text));

                firstLetterBuf.Clear();

                firstLetterBuf.AddRange(GetPinyin(item)
                                        .Where(py => !firstLetterBuf.Contains(py[0].ToString()))
                                        .Select(py => py[0].ToString()));

                pinyin.AppendFormat("[{0}] ", string.Join(",", firstLetterBuf.ToArray()));
            }
            #region // 扩展大小写格式
            if (!caseSpread)
            {
                return(pinyin.ToString().Trim());
            }

            switch (format.GetCaseFormat)
            {
            case CaseFormat.CAPITALIZE_FIRST_LETTER:
                return(CapitalizeFirstLetter(pinyin).Trim());

            case CaseFormat.LOWERCASE:
                return(pinyin.ToString().ToLower());

            case CaseFormat.UPPERCASE:
                return(pinyin.ToString().ToUpper());

            default:
                return(pinyin.ToString());
            }
            #endregion
        }
Esempio n. 3
0
        /// <summary>
        /// 获取一个字符串内所有汉字的拼音(多音字取第一个读音,带格式)
        /// </summary>
        /// <param name="text">要获取拼音的汉字字符串</param>
        /// <param name="format">拼音输出格式化参数</param>
        /// <param name="caseSpread">是否将前面的格式中的大小写扩展到其它非拼音字符,默认为false。firstLetterOnly为false时有效 </param>
        /// <param name="firstLetterOnly">是否只取拼音首字母,为true时,format无效</param>
        /// <param name="multiFirstLetter">firstLetterOnly为true时有效,多音字的多个读音首字母是否全取,如果多音字拼音首字母相同,只保留一个</param>
        /// <returns>firstLetterOnly为true时,只取拼音首字母格式为[L],后面追加空格;multiFirstLetter为true时,多音字的多个拼音首字母格式为[L, H],后面追加空格</returns>
        public static string GetPinyin(string text, PinyinOutputFormat format, bool caseSpread, bool firstLetterOnly, bool multiFirstLetter)
        {
            if (string.IsNullOrEmpty(text))
            {
                return("");
            }

            var pinyin         = new StringBuilder();
            var firstLetterBuf = new List <string>();

            foreach (var item in text)
            {
                if (!PinyinUtil.IsHanzi(item))
                {
                    pinyin.Append(item);
                    continue;
                }

                if (!firstLetterOnly)
                {
                    pinyin.Append(GetUniqueOrFirstPinyinWithFormat(item, format) + " ");
                    continue;
                }
                if (!multiFirstLetter)
                {
                    pinyin.AppendFormat("[{0}] ", GetUniqueOrFirstPinyin(item)[0]);
                    continue;
                }

                firstLetterBuf.Clear();

                firstLetterBuf.AddRange(GetPinyin(item)
                                        .Select(py => py[0].ToString())
                                        // 这句是处理多音字,多音字的拼音可能首字母是一样的,
                                        // 如果是一样的,肯定就只返回一次
                                        .Distinct());

                pinyin.AppendFormat("[{0}] ", string.Join(",", firstLetterBuf.ToArray()));
            }

            #region // 扩展大小写格式
            if (firstLetterOnly || !caseSpread)
            {
                return(pinyin.ToString().Trim());
            }

            switch (format.GetCaseFormat)
            {
            case CaseFormat.CAPITALIZE_FIRST_LETTER:
                return(CapitalizeFirstLetter(pinyin));

            case CaseFormat.LOWERCASE:
                return(pinyin.ToString().Trim().ToLower());

            case CaseFormat.UPPERCASE:
                return(pinyin.ToString().Trim().ToUpper());

            default:
                return(pinyin.ToString().Trim());
            }
            #endregion
        }