C# 按字節截斷字符串

trim string to the specified number of bytes

把字符串轉成字節數組後,截斷至特定長度時,可能會導致尾部亂碼,可以使用以下方法進行安全截斷

 

@@@code

foreach (var encode in

new Encoding[]{

Encoding.UTF8,

Encoding.Unicode,

Encoding.Default

}

)

{

Console.WriteLine($"-----------------\r\n{encode.EncodingName}");

byte[] bs = encode.GetBytes(ss);

for (int i = 1; i < bs.Length; i++)

{

byte[] result = trimStringBytes(ss, encode, i);

Console.WriteLine($"截斷爲{i}個字節時,有效字節數:{result.Length},完整的字符串是:{encode.GetString(result)}");

 

}

}

 

/// <summary>

/// 截斷字符串字節數組

/// </summary>

/// <param name="ss"></param>

/// <param name="encoding"></param>

/// <param name="len">需要得到的長度</param>

/// <param name="bs">處理後的數組</param>

/// <returns></returns>

public static byte[] trimStringBytes( string ss, System.Text.Encoding encoding, int len)

{

if (len == 0)

{

return new byte[0];

}

byte[] bs = encoding.GetBytes(ss);

if (len >= bs.Length)

{

Array.Resize(ref bs, len);

return bs;

}

char[] cc = ss.ToCharArray();

int c = encoding.GetCharCount(bs, 0, len); //涉及了C個字符

int m = encoding.GetByteCount(cc, 0, c); //計算C個字符串應當使用的字節數

// 如果當前截斷導致字符串不完整(小於m),減1

if (m == len)

{

Array.Resize(ref bs, len);

return bs;

}

else

{

Array.Resize(ref bs, encoding.GetByteCount(cc, 0, c - 1));

return bs;

}

}

 

 

@@#

 

輸出結果

Unicode (UTF-8)

截斷爲1個字節時,有效字節數:0,完整的字符串是:

截斷爲2個字節時,有效字節數:0,完整的字符串是:

截斷爲3個字節時,有效字節數:3,完整的字符串是:單

截斷爲4個字節時,有效字節數:3,完整的字符串是:單

截斷爲5個字節時,有效字節數:3,完整的字符串是:單

截斷爲6個字節時,有效字節數:6,完整的字符串是:單位

截斷爲7個字節時,有效字節數:7,完整的字符串是:單位c

截斷爲8個字節時,有效字節數:8,完整的字符串是:單位cm

截斷爲9個字節時,有效字節數:8,完整的字符串是:單位cm

截斷爲10個字節時,有效字節數:8,完整的字符串是:單位cm

截斷爲11個字節時,有效字節數:11,完整的字符串是:單位cm!

截斷爲12個字節時,有效字節數:12,完整的字符串是:單位cm!1

截斷爲13個字節時,有效字節數:13,完整的字符串是:單位cm!12

-----------------

Unicode

截斷爲1個字節時,有效字節數:0,完整的字符串是:

截斷爲2個字節時,有效字節數:2,完整的字符串是:單

截斷爲3個字節時,有效字節數:2,完整的字符串是:單

截斷爲4個字節時,有效字節數:4,完整的字符串是:單位

截斷爲5個字節時,有效字節數:4,完整的字符串是:單位

截斷爲6個字節時,有效字節數:6,完整的字符串是:單位c

截斷爲7個字節時,有效字節數:6,完整的字符串是:單位c

截斷爲8個字節時,有效字節數:8,完整的字符串是:單位cm

截斷爲9個字節時,有效字節數:8,完整的字符串是:單位cm

截斷爲10個字節時,有效字節數:10,完整的字符串是:單位cm!

截斷爲11個字節時,有效字節數:10,完整的字符串是:單位cm!

截斷爲12個字節時,有效字節數:12,完整的字符串是:單位cm!1

截斷爲13個字節時,有效字節數:12,完整的字符串是:單位cm!1

截斷爲14個字節時,有效字節數:14,完整的字符串是:單位cm!12

截斷爲15個字節時,有效字節數:14,完整的字符串是:單位cm!12

-----------------

簡體中文(GB2312)

截斷爲1個字節時,有效字節數:0,完整的字符串是:

截斷爲2個字節時,有效字節數:2,完整的字符串是:單

截斷爲3個字節時,有效字節數:2,完整的字符串是:單

截斷爲4個字節時,有效字節數:4,完整的字符串是:單位

截斷爲5個字節時,有效字節數:5,完整的字符串是:單位c

截斷爲6個字節時,有效字節數:6,完整的字符串是:單位cm

截斷爲7個字節時,有效字節數:6,完整的字符串是:單位cm

截斷爲8個字節時,有效字節數:8,完整的字符串是:單位cm!

截斷爲9個字節時,有效字節數:9,完整的字符串是:單位cm!1

截斷爲10個字節時,有效字節數:10,完整的字符串是:單位cm!12

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章