我有一个字符串,我发送到外部打印功能 我需要用反斜杠填充字符串,以便正确打印。
具体来说,我需要一个接受这个例子输入的方法:
This is a string\nwith a line break\ta tab\rand a carriage return.
并输出:
This is a string\\nwith a line break\\ta tab\\rand a carriage return.
我是否需要对每个可能的逃避角色进行蛮力Replace
的反击等效?
尝试:
s.Replace("\\","\\\\")
不起作用,因为它正在寻找反斜杠文字。
s.Replace("\n","\\n")
显然有效,但我正在寻找的是通用方法。
编辑: 请不要建议暴力方法,我明白实施这种方法没问题。我的问题是,是否有更普遍的方法。
答案 0 :(得分:12)
private static string EscapeLiterals(string input)
{
using (var writer = new StringWriter())
{
using (var provider = CodeDomProvider.CreateProvider("CSharp"))
{
provider.GenerateCodeFromExpression(new CodePrimitiveExpression(input), writer, null);
return writer.ToString();
}
}
}
输入"\tHello\r\n\tLiterals!"
并将其转换为"\\tHello\\r\\n\\tLiterals!"
适用于任何输入 - 它将为您提供任何输出的转义序列。
答案 1 :(得分:4)
这是我用于此的功能。我已经在生产代码中使用了它多年,它似乎阻止了各种各样的角落案例。
/// <summary>
/// Escapes all characters in this string whose code is less than 32 using C/C#-compatible backslash escapes.
/// </summary>
public static string CLiteralEscape(this string value)
{
if (value == null)
throw new ArgumentNullException("value");
var result = new StringBuilder(value.Length + value.Length / 2);
for (int i = 0; i < value.Length; i++)
{
char c = value[i];
switch (c)
{
case '\0': result.Append(@"\0"); break;
case '\a': result.Append(@"\a"); break;
case '\b': result.Append(@"\b"); break;
case '\t': result.Append(@"\t"); break;
case '\n': result.Append(@"\n"); break;
case '\v': result.Append(@"\v"); break;
case '\f': result.Append(@"\f"); break;
case '\r': result.Append(@"\r"); break;
case '\\': result.Append(@"\\"); break;
case '"': result.Append(@"\"""); break;
default:
if (c >= ' ')
result.Append(c);
else // the character is in the 0..31 range
result.AppendFormat(@"\x{0:X2}", (int) c);
break;
}
}
return result.ToString();
}
答案 2 :(得分:0)
您可以使用多个替换来强制用可读控件字符替换空格:
s = s.Replace("\n", "\\n").Replace("\r", "\\r").Replace("\t", "\\t");
但是你不能将反斜率加倍,因为chars已经在内存中用二进制值转换。所以你需要手工更换每个炭。