5

エスケープ文字を含む文字列が返されます。

これがサンプル文字列です

"test \ 40gmail.com"

ご覧のとおり、エスケープ文字が含まれています。私はそれを実際の値に変換する必要があります

「test@gmail.com」

これどうやってするの?

4

4 に答える 4

10

のコードだけでなく、すべてのエスケープされた文字コードを置き換える場合は@、次のコードスニペットを使用して変換を行うことができます。

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();
}

このコードは、正規表現に依存して16進数のすべてのシーケンスを検索し、それらをに変換してint、結果の値をにキャストしますchar

于 2012-07-20T17:44:12.717 に答える
0

提供されているサンプル文字列("test\40gmail.com")はJIDエスケープされています。不正な形式ではなく、HttpUtility/WebUtilityはこのエスケープスキームを正しく処理しません。

dasblinkenlightとC.Barlowの回答で示唆されているように、文字列または正規表現関数を使用して確実に実行できます。これはおそらく、望ましい結果を達成するための最もクリーンな方法です。JIDエスケープをデコードするための.NETライブラリを知りません。また、簡単な検索はあまり見つかりませんでした。ただし、役立つ可能性のあるソースへのリンクは次のとおりです。

于 2012-07-20T18:07:33.450 に答える
0
string test = "test\40gmail.com";

test.replace(@"\40","@");

より一般的なアプローチが必要な場合...

HTMLデコード

于 2012-07-20T17:26:24.067 に答える
0

このコードを書いたところ、うまく機能しているようです...エスケープシーケンスがHEXであり、値の0x00toに対して有効である必要があります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;
}
于 2017-03-29T13:03:42.777 に答える