C# 如何将包含转义字符的字符串转换为字符串

C# 如何将包含转义字符的字符串转换为字符串,c#,.net,C#,.net,我有一个返回给我的字符串,其中包含转义字符 下面是一个示例字符串 “test\40gmail.com” 如您所见,它包含转义字符。我需要把它转换成它的真实价值 "test@gmail.com" 我该怎么做 string test = "test\40gmail.com"; test.replace(@"\40","@"); 如果你想要一个更一般的方法 如果您希望替换所有转义字符代码,而不仅仅是@的代码,您可以使用此代码片段进行转换: public static string Unescape

我有一个返回给我的字符串,其中包含转义字符

下面是一个示例字符串

“test\40gmail.com”

如您所见,它包含转义字符。我需要把它转换成它的真实价值

"test@gmail.com"

我该怎么做

string test = "test\40gmail.com";

test.replace(@"\40","@");
如果你想要一个更一般的方法


如果您希望替换所有转义字符代码,而不仅仅是
@
的代码,您可以使用此代码片段进行转换:

public static string UnescapeCodes(string src) {
    var rx = new Regex("\\\\([0-9A-Fa-f]+)");
    var res = new StringBuilder();
    var pos = 0;
    foreach (Match m in rx.Matches(src)) {
        res.Append(src.Substring(pos, m.Index - pos));
        pos = m.Index + m.Length;
        res.Append((char)Convert.ToInt32(m.Groups[1].ToString(), 16));
    }
    res.Append(src.Substring(pos));
    return res.ToString();
}

代码依赖正则表达式查找所有十六进制数字序列,将它们转换为
int
,并将结果值转换为
char

提供的示例字符串(
“test\40gmail.com”
)为。它没有格式错误,
HttpUtility
/
WebUtility
将无法正确处理此转义方案


正如dasblinkenlight和C.Barlow的答案中所建议的那样,您当然可以使用字符串或正则表达式函数来实现。这可能是达到预期效果的最干净的方法。我不知道有任何.NET库用于解码JID转义,而且简短的搜索也没有找到多少。但是,对于一些可能有用的源代码来说。

我刚刚编写了这段代码,它似乎工作得很好。。。它要求转义序列是十六进制的,并且对值的
0x00
0xFF
有效

// Example
str = remEscChars(@"Test\x0D") // str = "Test\r"
这是代码

private string remEscChars(string str)
{
   int pos = 0;
   string subStr = null;
   string escStr = null;

   try
   {
      while ((pos = str.IndexOf(@"\x")) >= 0)
      {
         subStr = str.Substring(pos + 2, 2);
         escStr = Convert.ToString(Convert.ToChar(Convert.ToInt32(subStr, 16)));
         str = str.Replace(@"\x" + subStr, escStr);
      }
   }
   catch (Exception ex)
   {
      throw ex;
   }

   return str;
}

这是唯一的情况,还是有许多不同的控制字符需要说明?HttpUtility和WebUtility都有解码方法-请参考您在web环境中工作的情况?(即,您的项目中是否已经有对System.Web的引用)。或者你需要一些独立的东西吗?请解释一下,在编辑之前,你可能没有看到你以前的答案。。当我第一次看到你的答案时,它有
test.replace(“\40”,”)
和@dasblinkenlight的命令应该是正确的。您需要
@“\40”
(与
测试的声明相同),以便C#一字不差地接受它。我对此投了反对票,因为答案只适用于示例字符串,而不适用于一般情况。我对正则表达式和C#(这么多转义字符)有点困惑。你可以自己发布正则表达式字符串(不是为C#使用而格式化的)吗?@James Sure,它是
\([0-9A-Fa-f]+)
(这里,正则表达式引擎对斜杠进行了转义,但编译器却没有)。在使用正则表达式时,使用C#“逐字字符串文字”非常方便。。e、 g.
var rx=new Regex(@“\\([0-9A-Fa-f]+)”)res.Append(src.Substring(pos,m.Index));应该是res.Append(src.Substring(pos,m.Index-pos));您假设他正在使用Jabber/chat客户端,但实际情况并非如此stated@MicahArmantrout不,我不是。我没说他在使用那个客户端,我说他用同样的方式逃逸了字符串。使用
\(十六进制值)
表示转义字符不依赖于平台。@MicahArmantrout否。我绝对不会这样假设。