Давайте построить строку в цикле ;у нас есть несколько категорий символов:
- Известные элементы управления, такие как
\n
, \t
, \r
- Элементы управления, такие как
\u0011
- Символы, которые должныбыть экранированным:
"
и \
- Простые символы, которые следует указывать в виде
Код:
using System.Linq;
...
private static IReadOnlyDictionary<char, string> s_KnownControls = new
Dictionary<char, string>() {
{ '\0', "\\0"},
{ '\a', "\\a"},
{ '\b', "\\b"},
{ '\n', "\\n"},
{ '\v', "\\v"},
{ '\t', "\\t"},
{ '\f', "\\f"},
{ '\r', "\\r"},
};
public static string ToLiteral(string input) {
if (null == input)
return null;
StringBuilder sb = new StringBuilder();
foreach (var c in input) {
if (char.IsControl(c))
sb.Append(s_KnownControls.TryGetValue(c, out var s)
? s
: $"\\u{((int)c):x4}");
else {
if (c == '"' || c == '\\') // escapement
sb.Append('\\');
sb.Append(c);
}
}
return sb.ToString();
}
Демо:
string[] tests = new string[] {
"12345678912\rJ\u0011",
"abc\tdef\t\0A\n\a\bB",
"abc\"def\"xyz\\pqr"
};
string report = string.Join(Environment.NewLine, tests
.Select(test => ToLiteral(test)));
Результат:
12345678912\rJ\u0011
abc\tdef\t\0A\n\a\bB
abc\"def\"xyz\\pqr