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”

}

C#截取字符串按字节截取SubString的更多相关文章

  1. 分割字符串和截取字符串:split 和substring

    //按“,”截取字符串 String id="123123,234534,453456"; String[] idArry = id.trim().split(",&qu ...

  2. SQL使用UPDATE和SUBSTRING截取字符串方法,从头截取到某个位置,截取中间片段,字符串中间截取到末尾或删除前面的字符串

    //从头截取 update 表名 set 表列名 =SUBSTRING(表列名,1,目标位置数值)  //!计数从1开始,从左往右 where 条件   //条件自己选择,不加where条件会更新所有 ...

  3. JS 字符串转字节截取

    /* * param str 要截取的字符串 * param L 要截取的字节长度,注意是字节不是字符,一个汉字两个字节 * return 截取后的字符串 */ function CutStr(str ...

  4. JavaScript截取字符串的Slice、Substring、Substr函数简单比较还有indexof函数应用

    //截取字符,一看就明白!!! var str = "0123456789"; alert(str.substring(5)); 弹出 //56789 alert(str.subs ...

  5. 解决在C#(.net)按字节数截取字符串最后出现乱码的问题

    最近需要用到按字节数截取字符串.在网上找了很多方法. Encoding.Default.GetString采用的DefaultEncoding.UTF8.GetBytes采用的是utf-8编码.这样当 ...

  6. 【转】C#中如何实现左截取和右截取字符串

    使用C#语法编写程序时,我们需要截取一个字符串左边或右边的若干个字符,该如何操作呢?在VB中可以使用left或right函数实现,C#中没有提供这样的函数呢?答案是没有.但是,C#中提供Substri ...

  7. mysql根据字符截取字符串(总结)

    mysql根据字符截取字符串(总结) 1.1 前言   为结合自己平常查资料的习惯,我会先给出例子,然后再对相关知识进行详解.该案例使用到的函数为:SUBSTRING_INDEX 1.2 需要实现的实 ...

  8. js查找字符串、js截取

    js查找元素.js查找字符串 let index=data.indexOf(","); js截取.js截取字符串 $("#bankurl_id").val(da ...

  9. Linux Shell 截取字符串

    Linux Shell 截取字符串 shell中截取字符串的方法很多 ${var#*/} ${var##*/} ${var%/*} ${var%%/*} ${var:start:len} ${var: ...

随机推荐

  1. 关于C# winform怎么调用webapi来获取到json数据

    C/S系统也可以和B/S系统一样实现“前后端分离”,那这样写winform就相当于纯粹的前端页面了,然后再单独部署一个webapi项目,通过api调用数据库进行数据的操作,有利于维护和数据安全性的提高 ...

  2. Tensorflow 笔记

    TensorFlow笔记-08-过拟合,正则化,matplotlib 区分红蓝点 TensorFlow笔记-07-神经网络优化-学习率,滑动平均 TensorFlow笔记-06-神经网络优化-损失函数 ...

  3. express 与 koa 区别

    express 与 koa 区别 区别项 express koa 中间件模型 Compress 模型 洋葱圈模型 对象个数 只有2个对象:Request 和 Response 有3个对象:Reques ...

  4. 使用JMeter进行RESTful API测试

    使用JMeter进行RESTful API测试 在哪里设置实现最优脚本重用的属性 由于支持云的应用程序通常可以轻松.快速地进行复制和部署,所以可以在多种环境中对其进行测试.如果您需要在多个环境中测试和 ...

  5. 关于java的一些小知识(课程作业01)

    1,在java源代码中加空格注释不会影响程序的编译速度. 2,一个java类文件中真的只能有一个公有类吗? 如果只在第一个public类里面定义实体,或者两个都不定义并没有报错且程序可以运行.每个编译 ...

  6. xe5 android 控制蓝牙[转]

    用以下代码中的接口实现控制蓝牙的开.关及详细信息 unit Androidapi.JNI.BluetoothAdapter; // (c) RedTitan Technology 2013// JNI ...

  7. navigator 判断移动端是Android还是iOS

    let u = navigator.userAgent; let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...

  8. win7下python2.6如何安装setuptools和pip

    1. 下载 setuptools-0.6c9.tar.gz 下载地址:http://pypi.python.org/packages/source/s/setuptools/setuptools-0. ...

  9. SQL Server CONVERT() 日期转换为新数据类型的 通用函数

    http://www.w3school.com.cn/sql/func_convert.asp

  10. 【springBoot】之快速构建一个web项目

    基于maven,首先看pom文件 <parent> <groupId>org.springframework.boot</groupId> <artifact ...