汉字转换为拼音 第二篇

#region 变量定义
         // GB2312-80 标准规范中第一个汉字的机内码.即"啊"的机内码
         private const int firstChCode = -20319;
         // GB2312-80 标准规范中最后一个汉字的机内码.即"齄"的机内码
         private const int lastChCode = -2050;
         // GB2312-80 标准规范中最后一个一级汉字的机内码.即"座"的机内码
         private const int lastOfOneLevelChCode = -10247;
         // 配置中文字符
         //static Regex regex = new Regex("[\u4e00-\u9fa5]$");
 
         #endregion
         #endregion
 
         /// <summary>
         /// 取拼音第一个字段
         /// </summary>        
         /// <param name="ch"></param>        
         /// <returns></returns>        
          public static String GetFirst(Char ch)   
          {
              var rs = Get(ch);  
              if (!String.IsNullOrEmpty(rs)) rs = rs.Substring(0, 1); 
                              
              return rs;   
          }
 
         /// <summary>
         /// 取拼音第一个字段
         /// </summary>
         /// <param name="str"></param>
         /// <returns></returns>
          public static String GetFirst(String str)
          {
              if (String.IsNullOrEmpty(str)) return String.Empty; 
 
              var sb = new StringBuilder(str.Length + 1); 
              var chs = str.ToCharArray(); 
 
              for (var i = 0; i < chs.Length; i++) 
              { 
                  sb.Append(GetFirst(chs[i]));
              } 
              
              return sb.ToString();
          }
         
         /// <summary>
          /// 获取单字拼音
         /// </summary>
         /// <param name="ch"></param>
        /// <returns></returns>
          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 中文字符处理
 
              //if (chr < -20319 || chr > -10247) { // 不知道的字符  
              //    return null;  
          
              //for (var i = pyValue.Length - 1; i >= 0; i--)
              //{                
              //    if (pyValue[i] <= chr) return pyName[i];//这只能对应数组已经定义的           
              //}             
              
              return String.Empty;
          }
 
         /// <summary>
          /// 把汉字转换成拼音(全拼)
         /// </summary>
          /// <param name="str">汉字字符串</param>
          /// <returns>转换后的拼音(全拼)字符串</returns>
          public static String Get(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();
          }
     }
 }

 

首字母大写

https://www.cnblogs.com/scottckt/archive/2011/06/20/2085176.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值