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”
}
C#截取字符串按字节截取SubString的更多相关文章
- 分割字符串和截取字符串:split 和substring
//按“,”截取字符串 String id="123123,234534,453456"; String[] idArry = id.trim().split(",&qu ...
- SQL使用UPDATE和SUBSTRING截取字符串方法,从头截取到某个位置,截取中间片段,字符串中间截取到末尾或删除前面的字符串
//从头截取 update 表名 set 表列名 =SUBSTRING(表列名,1,目标位置数值) //!计数从1开始,从左往右 where 条件 //条件自己选择,不加where条件会更新所有 ...
- JS 字符串转字节截取
/* * param str 要截取的字符串 * param L 要截取的字节长度,注意是字节不是字符,一个汉字两个字节 * return 截取后的字符串 */ function CutStr(str ...
- JavaScript截取字符串的Slice、Substring、Substr函数简单比较还有indexof函数应用
//截取字符,一看就明白!!! var str = "0123456789"; alert(str.substring(5)); 弹出 //56789 alert(str.subs ...
- 解决在C#(.net)按字节数截取字符串最后出现乱码的问题
最近需要用到按字节数截取字符串.在网上找了很多方法. Encoding.Default.GetString采用的DefaultEncoding.UTF8.GetBytes采用的是utf-8编码.这样当 ...
- 【转】C#中如何实现左截取和右截取字符串
使用C#语法编写程序时,我们需要截取一个字符串左边或右边的若干个字符,该如何操作呢?在VB中可以使用left或right函数实现,C#中没有提供这样的函数呢?答案是没有.但是,C#中提供Substri ...
- mysql根据字符截取字符串(总结)
mysql根据字符截取字符串(总结) 1.1 前言 为结合自己平常查资料的习惯,我会先给出例子,然后再对相关知识进行详解.该案例使用到的函数为:SUBSTRING_INDEX 1.2 需要实现的实 ...
- js查找字符串、js截取
js查找元素.js查找字符串 let index=data.indexOf(","); js截取.js截取字符串 $("#bankurl_id").val(da ...
- Linux Shell 截取字符串
Linux Shell 截取字符串 shell中截取字符串的方法很多 ${var#*/} ${var##*/} ${var%/*} ${var%%/*} ${var:start:len} ${var: ...
随机推荐
- js中的eval函数另一种实现
js中有一个函数eval可以一段文本改为js代码,本来使用eval也可以达到目的,但自己看了不少资料都不推荐使用eval函数,于是自己就在思考有没有不使用eval的方法? 其实需求很简单,就是把一个 ...
- mysql之 事务prepare 与 commit 阶段分析
打开binlog选项后,执行事务提交命令时,就会进入两阶段提交模式.两阶段提交分为prepare阶段和commit两个阶段.流程如下 :这里面涉及到两个重要的参数:innodb_flush_log_a ...
- focus、input、keydown、keyup、change、blur方法的差异
focus.input.keydown.keyup.change.blur方法的差异: https://blog.csdn.net/yiifaa/article/details/52372022 bl ...
- 二维指针的malloc内存分配(转)
写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误.下面贴上一些示例代码,以供参考. 如果要给二维数组(m*n)分配空间,代码可以写成下面: char **a, i; 1 ...
- Zookeeper Java API调用
引入zookeeper-3.4.11.jar public class ZooKeeperTest implements Watcher{ //public final static String z ...
- HDFS管理工具HDFS Explorer
HDFS Explorer是一个在windows上管理HDFS系统的工具,支持上传.下载.重命.复制.移动和删除等. 一.下载地址 CSDN下载地址:http://download.csdn.net/ ...
- TL-WDR4310 v1 救砖
一.引出ttl线 用万用表测量,可以确定“GND”,第一个pin(焊盘为方的)为“Tx”,接下去依次为“Rx”.”GND”.”VCC“. 二.工具准备 下载tptpd软件工具,图标为 三.开始刷机 1 ...
- Vivado使用技巧(1)
Vivado使用技巧 (1) 1. 2.复位准则: 3. 4. 5. 6. 7. 8.
- zookeeper选举状态介绍 摘自https://cloud.tencent.com/developer/news/303891
zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服 ...
- 【转】mysql给root开启远程访问权限,修改root密码
好记性不如烂笔头,偶然用一直忘.... mysql给root开启远程访问权限,修改root密码 1.MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1) ...