C#截取字符串按字节截取SubString

时间:2021-08-14 08:31:23

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”

}