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”
}