trim string to the specified number of bytes
把字符串轉成字節數組後,截斷至特定長度時,可能會導致尾部亂碼,可以使用以下方法進行安全截斷
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