Проблема с кодировкой HttpWebResponse - PullRequest
1 голос
/ 03 января 2012

Запуск приведенного ниже кода с помощью Fiddler показывает, что знаки плюс преобразуются в какой-то символ пробела.Какую кодировку я должен использовать, чтобы предотвратить преобразование данных?Я хотел бы сохранить знаки плюс и т. Д.

РЕДАКТИРОВАТЬ: Обновленный пример кода

string postData = "test1=test+plussign&test2=another++twoplussigns";
private static byte[] EncodePostData(string postData)
{
    StringBuilder sb = new StringBuilder();

    string[] pairs = postData.Split('&');
    foreach (string pair in pairs)
    {
        string key = Uri.EscapeDataString(pair.Split('=')[0]);
        string value = Uri.EscapeDataString(pair.Split('=')[1]);

        sb.AppendFormat("{0}={1}&",key, value);
    }
    sb.Remove(sb.Length - 1, 1);

    return HttpUtility.UrlEncodeToBytes(sb.ToString());
}

А вот метод вызова

byte[] data = EncodePostData(postData);

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.UserAgent = "Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.03";
request.CookieContainer = cookies;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
ServicePointManager.Expect100Continue = false;

Stream stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();

HttpWebResponse Response = (HttpWebResponse)request.GetResponse();
Response.Close();

Ответы [ 3 ]

2 голосов
/ 03 января 2012

Поскольку ваша переменная называется postData, я предполагаю, что вы делаете HTTP POST для веб-сервера.

Сводка Википедии правил для HTTP POSTis:

Когда веб-браузер отправляет запрос POST от элемента веб-формы, тип интернет-медиа по умолчанию - «application / x-www-form-urlencoded».Это формат для кодирования пар ключ-значение с возможно дублирующимися ключами.Каждая пара ключ-значение отделяется символом «&», а каждый ключ отделяется от своего значения символом «=».Ключи и значения экранируются, заменяя пробелы символом «+» и затем используя кодировку URL для всех других не буквенно-цифровых символов.

То есть интерпретация по умолчанию '+' в HTTPТело POST - это закодированный символ ' '.Вам необходимо правильно экранировать свои данные, вызвав Uri.EscapeDataString или HttpUtility.UrlEncode .

Uri.EscapeDataString("test+PlusSigns"); // returns "test%2BPlusSigns"

В качестве альтернативы, используйте HttpUtility.UrlEncodeToBytes и записать получающиеся байты непосредственно в поток запросов (без использования StreamWriter).

(Обратите внимание, что если вы отправляете пары ключ / значение, вам нужно экранировать каждый ключ и значение независимо, а затем присоединитьсяони с '=' и '&' символами.)

1 голос
/ 03 января 2012

Попробуйте это:

string postData =  Uri.EscapeDataString("test+PlusSigns");
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(postData);
writer.Close();

HttpWebResponse Response = (HttpWebResponse)request.GetResponse();
Response.Close();
0 голосов
/ 03 января 2012

Максимум, что вы можете сделать, это установить тип содержимого запроса

myReq.ContentType = "text/html; charset=UTF-8";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...