C# HttpWebResponse的编码问题

C# HttpWebResponse的编码问题,c#,.net,http,encoding,C#,.net,Http,Encoding,使用Fiddler运行下面的代码表明加号正在转换为某种类型的空格字符。我应该使用什么编码来防止数据被转换?我想保留加号等 编辑:更新的代码示例 string postData = "test1=test+plussign&test2=another++twoplussigns"; private static byte[] EncodePostData(string postData) { StringBuilder sb = new StringBuilder();

使用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();
试试这个:

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

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

您最多可以设置请求内容类型

myReq.ContentType = "text/html; charset=UTF-8";

因为变量名为
postData
,所以我假设您正在向web服务器发送HTTP POST

HTTP POST的规则包括:

当web浏览器从web表单元素发送POST请求时 默认Internet媒体类型为“application/x-www-form-urlencoded”。 这是一种对可能重复的键值对进行编码的格式 钥匙。每个键值对由一个“&”字符分隔,每个 键与其值之间用“=”字符分隔。键和值 通过将空格替换为“+”字符,然后 对所有其他非字母数字字符使用URL编码

也就是说,HTTP POST正文中
'+'
的默认解释是编码的
'
字符。您需要通过调用或正确地转义数据

或者,使用结果字节并将其直接写入请求流(不使用
StreamWriter


(请注意,如果您要发送键/值对,则需要独立地转义每个键和值,然后使用
'='
'&'
字符将它们连接起来。)

他询问的是他在请求中设置的数据,而不是他返回的数据。@AndrewBarber我更新了问题以澄清。我发送的内容正是我想要的,但它似乎是由HttpWebResponse编码的,当我在Fiddler中查看它时,它是错误的,并且不完全是我发送的内容。@Anand+1试图帮助:)我更新了问题以澄清一点。我尝试了这个,但没有改变任何东西。我也尝试过UTF8Encoding类。谢谢你的建议。我已经尝试过了,并更新了OP以反映新的代码。现在Fiddler显示“data”得到的是=和&编码,因此它现在是一个大字符串,而不是单独的参数。这是因为您只需要对值进行URL编码(键在=之前,值在后面,每个键/值对由符号和分隔),不是整个POST字符串。@Jon C:对
HttpUtility.UrlEncodeToBytes(sb.ToString())
的最后调用不正确;这是双重逃避你的屈服。此时您的字符串已被URL编码。由于它现在应该只由ASCII字符组成,您可以使用
System.Text.Encoding.ASCII.GetBytes(sb.ToString())
来获取要发送到服务器的字节。@任务:严格来说,密钥也需要转义(尽管在大多数情况下,将
=
&
作为键名的一部分是不可能的,也不推荐在所有情况下使用)。@BradleyGrainger Duh,顾名思义UrlEncodeToBytes:)感谢您指出这一点。让我试一试,我会让你知道事情的进展。
Uri.EscapeDataString("test+PlusSigns"); // returns "test%2BPlusSigns"