標籤:utf-8 string
C# 字串按位元組截取
/// <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;
}
/// <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;
}