如何正确地逃避这个字符串

时间:2012-11-26 20:59:21

标签: c# string

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

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

编辑: 请不要建议暴力方法,我明白实施这种方法没问题。我的问题是,是否有更普遍的方法。

3 个答案:

答案 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已经在内存中用二进制值转换。所以你需要手工更换每个炭。