Ответ 1
Вы можете использовать HttpEncoder.HeaderNameValueEncode Method в .NET Framework 4.0 и выше.
Для предыдущих версий .NET Framework вы можете свернуть собственный кодер, используя логику, указанную на странице справки HttpEncoder.HeaderNameValueEncode:
-
Все символы, значение Unicode которых меньше ASCII-символа 32, кроме символа ASCII 9, кодируются URL-адресами в формате% NN, где N символов представляют шестнадцатеричные значения.
-
Символ ASCII 9 (символ горизонтальной вкладки) не кодируется URL.
-
Символ ASCII 127 кодируется как% 7F.
-
Все остальные символы не закодированы.
Update:
Как указывает OliverBock, метод HttpEncoder.HeaderNameValueEncode защищен и внутренне. Я пошел в проект с открытым исходным кодом Mono и нашел моно-реализацию
void HeaderNameValueEncode (string headerName, string headerValue, out string encodedHeaderName, out string encodedHeaderValue)
{
if (String.IsNullOrEmpty (headerName))
encodedHeaderName = headerName;
else
encodedHeaderName = EncodeHeaderString (headerName);
if (String.IsNullOrEmpty (headerValue))
encodedHeaderValue = headerValue;
else
encodedHeaderValue = EncodeHeaderString (headerValue);
}
static void StringBuilderAppend (string s, ref StringBuilder sb)
{
if (sb == null)
sb = new StringBuilder (s);
else
sb.Append (s);
}
static string EncodeHeaderString (string input)
{
StringBuilder sb = null;
for (int i = 0; i < input.Length; i++) {
char ch = input [i];
if ((ch < 32 && ch != 9) || ch == 127)
StringBuilderAppend (String.Format ("%{0:x2}", (int)ch), ref sb);
}
if (sb != null)
return sb.ToString ();
return input;
}
Просто FYI
[здесь] (https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web.Util/HttpEncoder.cs)