標籤:ar os sp for on art bs ef tt
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