diff --git a/src/neoxp/Extensions/Extensions.cs b/src/neoxp/Extensions/Extensions.cs index 3df9836e..be0cbd69 100644 --- a/src/neoxp/Extensions/Extensions.cs +++ b/src/neoxp/Extensions/Extensions.cs @@ -119,6 +119,33 @@ public static bool TryGetBytesFromBase64String(this string text, out Span + + public static string EscapeString(this string text) + { + if (text.Any(IsInvisibleChar)) + { + var sb = new StringBuilder(); + foreach (var c in text) + { + if (c.IsInvisibleChar()) + { + sb.Append($"\\u{(int)c:x4}"); + } + else + { + sb.Append(c); + } + } + return sb.ToString(); + } + return text; + } + + public static bool IsInvisibleChar(this char c) + { + return char.IsControl(c) || char.IsHighSurrogate(c) || char.IsLowSurrogate(c); + } + public static void WriteJson(this Newtonsoft.Json.JsonWriter writer, Neo.Json.JToken? json) { switch (json) diff --git a/src/neoxp/TransactionExecutor.cs b/src/neoxp/TransactionExecutor.cs index 1afeffc7..776a1027 100644 --- a/src/neoxp/TransactionExecutor.cs +++ b/src/neoxp/TransactionExecutor.cs @@ -294,7 +294,7 @@ static async Task WriteStackItemAsync(System.IO.TextWriter writer, Neo.VM.Types. case Neo.VM.Types.ByteString byteString: if (byteString.GetSpan().TryGetUtf8String(out var text)) { - await WriteLineAsync($"{Neo.Helper.ToHexString(byteString.GetSpan())}({text})").ConfigureAwait(false); + await WriteLineAsync($"{Neo.Helper.ToHexString(byteString.GetSpan())}({text.EscapeString()})").ConfigureAwait(false); } else {