【问题标题】:Escape characters in string being escaped转义字符串中的转义字符
【发布时间】:2013-10-25 14:20:31
【问题描述】:

我有一个 WPF 应用程序,它正在捕获一些文本,如下所示:

<TextBox x:Name="MyText" Text="\n,\r"/>

然后我将它传递给一个函数,该函数正在检查字符串中是否存在这些字符:

MyFunc(MyText.Text);

但是字符被转义了;所以 MyText.Text 看起来像这样:

"\\n,\\r"

如何防止字符串被转义(如果是文字,我可以简单地使用@ 字符,但这是由用户输入的)?

【问题讨论】:

  • 您能否澄清一下:此文本是由用户输入到 TextBox 中的,还是在 XAML 中以编程方式设置的?如果是后者,那么您应该使用 XML 转义序列,而不是 C# 样式的转义序列。 \r\n 的 XML(以及 XAML)等价物是 &amp;#10;&amp;#13;
  • 是用户输入的文本;但目的是指示新行或其他不可见字符
  • 那么,用户是输入文字文本\r\n,还是输入换行符?如果是前者,那么您需要手动取消转义文本,如@Sheridan 的回答。
  • 否 - 他们正在输入文字文本,例如\n 我正在尝试将其与实际的换行进行比较。
  • 那你就需要手动转义了。我添加了一个显示方法的答案。

标签: c# .net wpf xaml special-characters


【解决方案1】:

\\ 替换为\ 怎么样?:

string unescapedValue = MyText.Text.Replace(@"\\", @"\");

但是,我怀疑您的文本值只是在 Visual Studio Intellisense 中被转义......当您调用它时您会得到什么值:

int actualLength = MyText.Text.Length;

我怀疑您的 "\\n,\\r" 值将返回 3,因为那里实际上只有 3 个字符。如果我错了,请使用第一个示例。

【讨论】:

  • 好的 - 这两个都试过了。问题是,尽管调试器有第三个 \,但它不应该存在。转义字符也不能被替换,因为正如你所说的那样 - 它不存在。
  • 如果它不存在,那么这会导致什么问题?
【解决方案2】:

你确定吗?
我怀疑您正在查看调试,并且调试鼠标悬停会逃脱。

试试

System.Diagnostics.Debug.WriteLine(MyText.Text);
System.Diagnostics.Debug.WriteLine(MyText.Text.Length.ToString());

长度为 5,因为 \n 是两个字符而不是单个控制字符。

【讨论】:

  • 是的,如上所述;它将 \n 视为两个字符,因此虽然转义字符并不真正存在,但它也不是真正的换行符。
  • 好的,但这不是对上述问题的回答吗?
  • 问题是“如何防止字符串被转义?”。你的回答是它没有被逃脱,它是。
  • 来吧,你看到鼠标上的 \\ 并感到困惑。它没有被转义——你得到的是文本框中的字面意思。您将控制字符与转义混淆。打印机控制字符与 C# 中使用的转义字符无关。
【解决方案3】:

您需要通过检测本身已转义的转义码来手动取消转义文本。你可以这样做:

private static string Unescape(string value) {
    if (value == null)
        return null;

    var length = value.Length;
    var result = new StringBuilder(length);

    for (var i = 0; i < length; i++) {
        var c = value[i];

        if (c == '\\' && i++ < length) {
            c = value[i];

            switch (c) {
                case 'n':
                    result.Append('\n');
                    break;
                case 'r':
                    result.Append('\r');
                    break;
                case 't':
                    result.Append('\t');
                    break;
                case '\\':
                    result.Append('\\');
                    break;
                default:
                    result.Append(c);
                    break;
            }
        }
        else {
            result.Append(c);
        }
    }

    return result.ToString();
}

【讨论】:

    【解决方案4】:

    我遇到了和你一样的问题,看了这篇How can I Unescape and Reescape strings in .net?How can I Unescape and Reescape strings in .net?

    System.Text.RegularExpressions.Regex.Unescape(MyText.Text);
    

    它会自动转义你的字符串

    \\n => \n
    \\t => \t
    

    附加功能

    我可以看到很多人不明白这是如何导致问题的

    一个简单的例子如下所示:

    var delimiter = MyText.Text; // this will give you \\t, if you type \t in the textbox
    string[] data = new string[] { "hello", "world" };
    var concatData = String.Join(text, data); 
    
    // concatData will return => hello\\tworld\\t rather than hello    world
    

    【讨论】:

      【解决方案5】:

      您应该将文本框绑定到某个属性。 不能直接通过设计器设置格式化文本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 2014-03-17
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多