zoukankan      html  css  js  c++  java
  • C#截取字符串按字节截取SubString

     public static string CutByteString(string str,int len)
        {
          string result=string.Empty;// 最终返回的结果
          if(string.IsNullOrEmpty(str)) { return result; }
          int byteLen=System.Text.Encoding.Default.GetByteCount(str);// 单字节字符长度
          int charLen=str.Length;// 把字符平等对待时的字符串长度
          int byteCount=0;// 记录读取进度
          int pos=0;// 记录截取位置
          if(byteLen>len)
          {
            for(int i=0;i<charLen;i++)
            {
              if(Convert.ToInt32(str.ToCharArray()[i])>255)// 按中文字符计算加2
              { byteCount+=2; }
              else// 按英文字符计算加1
              { byteCount+=1; }
              if(byteCount>len)// 超出时只记下上一个有效位置
              {
                pos=i;
                break;
              }
              else if(byteCount==len)// 记下当前位置
              {
                pos=i+1;
                break;
              }
            }
            if(pos>=0)
            { result=str.Substring(0,pos); }
          }
          else
          { result=str; }
          return result;
        }


     public static string CutByteString(string str,int startIndex,int len)

        {
          string result=string.Empty;// 最终返回的结果
          if(string.IsNullOrEmpty(str)) { return result; }
          int byteLen=System.Text.Encoding.Default.GetByteCount(str);// 单字节字符长度
          int charLen=str.Length;// 把字符平等对待时的字符串长度
          if(startIndex==0)
          { return CutByteString(str,len); }
          else if(startIndex>=byteLen)
          { return result; }
          else //startIndex < byteLen
          {
            int AllLen=startIndex+len;
            int byteCountStart=0;// 记录读取进度
            int byteCountEnd=0;// 记录读取进度
            int startpos=0;// 记录截取位置                
            int endpos=0;// 记录截取位置
            for(int i=0;i<charLen;i++)
            {
              if(Convert.ToInt32(str.ToCharArray()[i])>255)// 按中文字符计算加2
              { byteCountStart+=2; }
              else// 按英文字符计算加1
              { byteCountStart+=1; }
              if(byteCountStart>startIndex)// 超出时只记下上一个有效位置
              {
                startpos=i;
                AllLen=startIndex+len-1;
                break;
              }
              else if(byteCountStart==startIndex)// 记下当前位置
              {
                startpos=i+1;
                break;
              }
            }
            if(startIndex+len<=byteLen)//截取字符在总长以内
            {
              for(int i=0;i<charLen;i++)
              {
                if(Convert.ToInt32(str.ToCharArray()[i])>255)// 按中文字符计算加2
                { byteCountEnd+=2; }
                else// 按英文字符计算加1
                { byteCountEnd+=1; }
                if(byteCountEnd>AllLen)// 超出时只记下上一个有效位置
                {
                  endpos=i;
                  break;
                }
                else if(byteCountEnd==AllLen)// 记下当前位置
                {
                  endpos=i+1;
                  break;
                }
              }
              endpos=endpos-startpos;
            }
            else if(startIndex+len>byteLen)//截取字符超出总长
            {
              endpos=charLen-startpos;
            }
            if(endpos>=0)
            { result=str.Substring(startpos,endpos); }
          }
          return result;
        }

    调用:
        private void button1_Click(object sender,EventArgs e)
        {
          string s="一二3456七八";
          s=CutByteString(s,5);

          MessageBox.Show(s);    //输出 “一二3”


          s=CutByteString(s,3,5);
          MessageBox.Show(s);     //输出 “二345”

        }


  • 相关阅读:
    flock对文件锁定读写操作的问题 简单
    hdu 2899 Strange Fuction(二分)
    hdu 2199 Can you solve this equation? (二分)
    poj 3080 Blue Jeans (KMP)
    poj 2823 Sliding Window (单调队列)
    poj 2001 Shortest Prefixes (trie)
    poj 2503 Babelfish (trie)
    poj 1936 All in All
    hdu 3507 Print Article (DP, Monotone Queue)
    fzu 1894 志愿者选拔 (单调队列)
  • 原文地址:https://www.cnblogs.com/xtfnpgy/p/9285411.html
Copyright © 2011-2022 走看看