• c# 根据中文汉字获取到拼音


    public static String ConvertToPinyin(String str)
            {
                if (String.IsNullOrEmpty(str)) return String.Empty;
    
                var sb = new StringBuilder(str.Length * 10);
                var chs = str.ToCharArray();
    
                for (var j = 0; j < chs.Length; j++)
                {
                    sb.Append(Get(chs[j]));
                }
    
                return sb.ToString();
            }
    public static String Get(Char ch)
            {
                // 拉丁字符            
                if (ch <= 'x00FF') return ch.ToString();
    
                // 标点符号、分隔符            
                if (Char.IsPunctuation(ch) || Char.IsSeparator(ch)) return ch.ToString();
    
                // 非中文字符            
                if (ch < 'x4E00' || ch > 'x9FA5') return ch.ToString();
    
                var arr = Encoding.GetEncoding("gb2312").GetBytes(ch.ToString());
                //Encoding.Default默认在中文环境里虽是GB2312,但在多变的环境可能是其它
                //var arr = Encoding.Default.GetBytes(ch.ToString()); 
                var chr = (Int16)arr[0] * 256 + (Int16)arr[1] - 65536;
    
                //***// 单字符--英文或半角字符  
                if (chr > 0 && chr < 160) return ch.ToString();
                #region 中文字符处理
    
                // 判断是否超过GB2312-80标准中的汉字范围
                if (chr > lastChCode || chr < firstChCode)
                {
                    return ch.ToString(); ;
                }
                // 如果是在一级汉字中
                else if (chr <= lastOfOneLevelChCode)
                {
                    // 将一级汉字分为12块,每块33个汉字.
                    for (int aPos = 11; aPos >= 0; aPos--)
                    {
                        int aboutPos = aPos * 33;
                        // 从最后的块开始扫描,如果机内码大于块的第一个机内码,说明在此块中
                        if (chr >= pyValue[aboutPos])
                        {
                            // Console.WriteLine("存在于第 " + aPos.ToString() + " 块,此块的第一个机内码是: " + pyValue[aPos * 33].ToString());
                            // 遍历块中的每个音节机内码,从最后的音节机内码开始扫描,
                            // 如果音节内码小于机内码,则取此音节
                            for (int i = aboutPos + 32; i >= aboutPos; i--)
                            {
                                if (pyValue[i] <= chr)
                                {
                                    // Console.WriteLine("找到第一个小于要查找机内码的机内码: " + pyValue[i].ToString());
                                    return pyName[i];
                                }
                            }
                            break;
                        }
                    }
                }
                // 如果是在二级汉字中
                else
                {
                    int pos = Array.IndexOf(otherChinese, ch.ToString());
                    if (pos != decimal.MinusOne)
                    {
                        return otherPinYin[pos];
                    }
                }
                #endregion 中文字符处理
         
    
                return String.Empty;
            }
  • 相关阅读:
    pythonselenium 3种等待方式
    SQL Server2008生成数据库字典
    C# 二分法查找和排序
    JavaScript 中的面向对象的初步认识
    分享一个通过面向对象方式完成的拖拽功能
    javascript 面向对象的继承的实现
    【转】ASP.NET MVC 3 Service Location, Part 3: View Engines/View Pages
    【转】ASP.NET MVC 3 Service Location, Part 2: Controllers
    【转】ASP.NET MVC 3 Service Location, Part 8: Value Providers
    【转】ASP.NET MVC 3 Service Location, Part 6: Model Validation
  • 原文地址:https://www.cnblogs.com/flywing/p/5051044.html
Copyright © 2020-2023  润新知