diff --git a/src/ZString/Utf8ValueStringBuilder.cs b/src/ZString/Utf8ValueStringBuilder.cs index 19df488..dfc9031 100644 --- a/src/ZString/Utf8ValueStringBuilder.cs +++ b/src/ZString/Utf8ValueStringBuilder.cs @@ -411,16 +411,17 @@ private void AppendFormatInternal(T arg, int width, StandardFormat format, st { width *= -1; - if (!FormatterCache.TryFormatDelegate(arg, buffer.AsSpan(index), out var charsWritten, format)) + if (!FormatterCache.TryFormatDelegate(arg, buffer.AsSpan(index), out var bytesWritten, format)) { - Grow(charsWritten); - if (!FormatterCache.TryFormatDelegate(arg, buffer.AsSpan(index), out charsWritten, format)) + Grow(bytesWritten); + if (!FormatterCache.TryFormatDelegate(arg, buffer.AsSpan(index), out bytesWritten, format)) { ThrowArgumentException(argName); } } - index += charsWritten; + var charsWritten = Encoding.UTF8.GetCharCount(buffer.AsSpan(index, bytesWritten)); + index += bytesWritten; int padding = width - charsWritten; if (width > 0 && padding > 0) @@ -445,23 +446,24 @@ private void AppendFormatInternal(T arg, int width, StandardFormat format, st { Span s = stackalloc byte[typeof(T).IsValueType ? Unsafe.SizeOf() * 8 : 1024]; - if (!FormatterCache.TryFormatDelegate(arg, s, out var charsWritten, format)) + if (!FormatterCache.TryFormatDelegate(arg, s, out var bytesWritten, format)) { s = stackalloc byte[s.Length * 2]; - if (!FormatterCache.TryFormatDelegate(arg, s, out charsWritten, format)) + if (!FormatterCache.TryFormatDelegate(arg, s, out bytesWritten, format)) { ThrowArgumentException(argName); } } + var charsWritten = Encoding.UTF8.GetCharCount(s.Slice(0, bytesWritten)); int padding = width - charsWritten; if (padding > 0) { Append(' ', padding); // TODO Fill Method is too slow. } - s.CopyTo(GetSpan(charsWritten)); - Advance(charsWritten); + s.CopyTo(GetSpan(bytesWritten)); + Advance(bytesWritten); } } }