6

我有一个要发送到外部打印函数的字符串。
我需要用反斜杠填充字符串,以便正确打印。

具体来说,我需要一个可以接受这个示例输入的方法:
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")显然有效,但我正在寻找的是一种通用方法。

编辑: 请不要建议蛮力方法,我理解实现这样的方法是没有问题的。我的问题是是否有更通用的方法。

4

3 回答 3

11
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!"

适用于任何输入 - 它会给你任何东西的转义序列。

于 2012-11-26T21:20:30.237 回答
3

这是我用于此的功能。多年来我一直在生产代码中使用它,它似乎可以抵御各种极端情况。

/// <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();
}
于 2012-11-29T06:23:41.563 回答
0

您可以使用多个替换来强制用可读的控制字符替换空格:

s = s.Replace("\n", "\\n").Replace("\r", "\\r").Replace("\t", "\\t");

但是,您不能像您想的那样简单地将反斜杠加倍,因为字符已经在内存中使用其二进制值进行了转换。所以你需要手动替换每个字符。

于 2012-11-26T21:02:25.220 回答