您的位置:首页 > 编程语言 > C#

c#截取指定字节长度的字符串

2012-04-24 10:15 537 查看
查了好久,截取指定长度字符串一般都是按 .Length截取的..不能精确到字节.花了点时间,自己弄了个.感觉能用..有错误希望指出.

/// <summary>

/// 截取指定字节长度的字符串

/// </summary>

/// <param name="str">原字符串</param>

/// <param name="len">截取字节长度</param>

/// <returns></returns>

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;

}

/// <summary>

/// 截取指定字节长度的字符串

/// </summary>

/// <param name="str">原字符串</param>

/// <param name="startIndex">起始位置</param>

/// <param name="len">截取字节长度</param>

/// <returns></returns>

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: