2010-05-04 3 views

ответ

-1

Mayeb Этот? UrlEncode Function

+0

Я ищу метод, который не выполняет кодировку, требуемую для URL-адреса, но просто рассматривает конкретные ограничения HTTP-заголовков – antonio

-1

извините его от верхней части головы, но для объекта запроса должен быть объект заголовков, к которому вы можете добавить.

i.e. request.headers.add ("blah");

Это не место, но оно должно указывать на вас в правильном направлении.

+0

Вопрос о кодировании значения заголовка, а не о добавлении заголовка. –

7

Вы можете использовать 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)

+1

HeaderNameValueEncode() защищен + внутренний. –

+1

@OliverBock вы правы, обновили сообщение. – liuhongbo

+0

К сожалению, ни эта версия, ни версия .NET (видимая через Reflector) не хотят правильно кодировать символы «%» уже в данных. –

0

Это делает ту же работу, как HeaderNameValueEncode(), но также будет кодировать% так что заголовок может быть надежно декодирован позже.

static string EncodeHeaderValue(string value) 
{ 
    return Regex.Replace(value, @"[\u0000-\u0008\u000a-\u001f%\u007f]", (m) => "%"+((int)m.Value[0]).ToString("x2")); 
} 

static string DecodeHeaderValue(string encoded) 
{ 
    return Regex.Replace(encoded, @"%([0-9a-f]{2})", (m) => new String((char)Convert.ToInt32(m.Groups[1].Value, 16), 1), RegexOptions.IgnoreCase); 
} 
2

Для меня помогли Uri.EscapeDataString (HeaderValue)

Смежные вопросы