Limit String By Byte Count

Date: 2021-04-13

Source: https://codereview.stackexchange.com/a/55114

void Main()
{
	const string Input = "a\u0304\u0308bc\u0327";
	var bytes = Encoding.UTF8.GetByteCount(Input);
	Console.WriteLine("{0} ({1} bytes in UTF-8)", Input, bytes);
	for (var i = 0; i <= bytes; i++)
	{
	    var result = LimitBytes(Input, Encoding.UTF8, i);
	    Console.WriteLine("{0} \"{1}\" {2}", i, result, Input.StartsWith(result, StringComparison.Ordinal));
	}
}

public static string LimitBytes(string input, Encoding encoding, int maxBytes)
{
    if (maxBytes == 0 || string.IsNullOrEmpty(input)) return string.Empty;
    if (encoding.GetByteCount(input) <= maxBytes) return input;
    var sb = new StringBuilder();
    var bytes = 0;
    foreach (char c in input)
    {
        bytes += encoding.GetByteCount(c.ToString());
        if (bytes > maxBytes) break;
        sb.Append(c);
    }
    return sb.ToString();
}

/* OUTPUT:
ā̈bç (9 bytes in UTF-8)
0 "" True
1 "a" True
2 "a" True
3 "ā" True
4 "ā" True
5 "ā̈" True
6 "ā̈b" True
7 "ā̈bc" True
8 "ā̈bc" True
9 "ā̈bç" True
*/
48710cookie-checkLimit String By Byte Count