エスケープ文字を含む文字列が返されます。
これがサンプル文字列です
"test \ 40gmail.com"
ご覧のとおり、エスケープ文字が含まれています。私はそれを実際の値に変換する必要があります
「test@gmail.com」
これどうやってするの?
のコードだけでなく、すべてのエスケープされた文字コードを置き換える場合は@
、次のコードスニペットを使用して変換を行うことができます。
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
。
提供されているサンプル文字列("test\40gmail.com"
)はJIDエスケープされています。不正な形式ではなく、HttpUtility
/WebUtility
はこのエスケープスキームを正しく処理しません。
dasblinkenlightとC.Barlowの回答で示唆されているように、文字列または正規表現関数を使用して確実に実行できます。これはおそらく、望ましい結果を達成するための最もクリーンな方法です。JIDエスケープをデコードするための.NETライブラリを知りません。また、簡単な検索はあまり見つかりませんでした。ただし、役立つ可能性のあるソースへのリンクは次のとおりです。
このコードを書いたところ、うまく機能しているようです...エスケープシーケンスがHEXであり、値の0x00
toに対して有効である必要があります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;
}