关于http get方法问题
网页中有一个连接包含中文,地址如下:"http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1"
在ie中执行正常
通过抓包工具可以看到以下内容:
“Get /userRpm/StatusRpm.htm?connect=\301\254%20\275\323&wan=1 http1.1”但是现在有一个问题,用c#写了一个自动执行的应用(winform),用的httpwebrequest类,提交的连接确是下面的样子:
“Get /userRpm/StatusRpm.htm?connect=%E8%BF%9E%20%E6%8E%A5&wan=1 http1.1”
我知道是uri编码的问题,换了几种编码,都不是ie中格式,所以不能实现功能。
请高手们指点一下,这是怎么回事,这个问题困扰了我好几天了。
谢谢

解决方案 »

  1.   


    使用 GET 方式提交中文数据, 编码方式要以目标的网站为标准。 常用的有 gb2312 和 utf8 两种,如: 
    Encoding mEncoding = Encoding.GetEncoding("gb2312");
    string strUrl = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=" + HttpUtility.UrlEncode("连 接", mEncoding);
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);
    req.Method = "GET";
    using (WebResponse wr = req.GetResponse())
    {
      
      

  2.   

    string temp = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1";
    string strurl = System.Web.HttpUtility.UrlEncode(temp);
      

  3.   

    使用 GET 方式提交中文数据, 编码方式要以目标的网站为标准。 常用的有 gb2312 和 utf8 两种,如: 
    Encoding mEncoding = Encoding.GetEncoding("gb2312");
    string strUrl = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=" + HttpUtility.UrlEncode("连 接", mEncoding);
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);
    req.Method = "GET";
    using (WebResponse wr = req.GetResponse())
    {
      

      

  4.   

    首先感谢楼上几位的帮助,你们说的我都用了,不行。
    网页的编码是gb2312,我提交的“/userRpm/StatusRpm.htm?connect= %E8%BF%9E%20%E6%8E%A5&wan=1”也是这个编码,
    但是从ie地址栏直接提交是这个:/userRpm/StatusRpm.htm?connect=\301\254%20\275\323&wan=1
    这两个提交信息中的中文编码不一样,我想再问一下,“\301\254”是什么编码?
    谢谢
      

  5.   


    你说3楼正确2楼复杂?string temp = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1"; 
    string strurl = System.Web.HttpUtility.UrlEncode(temp);正解个屁!整个URL都编码掉,你疯了?哈哈哈
      

  6.   

    楼上的,整个string temp = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1"; 
    string strurl = System.Web.HttpUtility.UrlEncode(temp); 
    应该不会错的它只是负责把不是url的合法部分编译成url楼主我强烈怀疑你错的地方是你的编码其他部分,你调试一下,弄一个临时变量,监视一下
    还有啊!
    下载网页代码,你不必在乎什么要和ie链接格式相等,你用firefox,它不支持中文名称的,如果url中有中文,firefox是要转换编码的!,关键就是转换编码的方法是否正确!UrlEncode这个应该是这个正确的,你自己好好调试检查......
      

  7.   

    10楼的哥哥,你能不能先试验一下你的代码再回帖子?你知不知道这样会害很多初学者?
    你知道
    string temp = "http://192.168.1.1/userRpm/StatusRpm.htm?connect=连 接&wan=1";  
    string strurl = System.Web.HttpUtility.UrlEncode(temp);  的执行结果是什么吗?不知道的话我告诉你:http%3a%2f%2f192.168.1.1%2fuserRpm%2fStatusRpm.htm%3fconnect%3d%e8%bf%9e+%e6%8e%a5%26wan%3d1 你觉得这是正确的吗?打倒信口开河的。
      

  8.   

    sorry,我的错,想当然去了
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;/// <summary>
    /// Class1 的摘要说明
    /// </summary>
    public class Class1
    {
    public Class1()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }    public static string InitChineseUrl(string chineseUrl)
        {
            Uri url = new Uri(chineseUrl);
            System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(url.Query, System.Text.Encoding.GetEncoding("utf-8"));
            string query = "";
            for (int i = 0; i < nv.Count; i++)
            {
                if (query.Trim() == string.Empty)
                {
                    query = "?" + nv.Keys[i] + "=" + HttpUtility.UrlEncode(nv[i], System.Text.Encoding.GetEncoding("GB2312"));
                }
                else
                {
                    query += "&" + nv.Keys[i] + "=" + HttpUtility.UrlEncode(nv[i], System.Text.Encoding.GetEncoding("GB2312"));
                }
            }
            string u = chineseUrl.Split('?')[0] + query;
            return u;
        }
    }
    这个也许能解决战斗
    楼主试试
      

  9.   

    http://192.168.1.1/userRpm/StatusRpm.htm?connect=%c1%ac+%bd%d3&wan=1
    返回结果是这个,没有空格
      

  10.   

    http://192.168.1.1/userRpm/StatusRpm.htm?connect=%c1%ac+%bd%d3&wan=1
    返回结果是这个,没有空格
      

  11.   

    兄弟,你13楼的代码,大部分情况下是不能工作的。假设你要parse的Url Query String是这样的(没有经过UrlEncode):?abc=def&url=http://www.abc.com/路径/page.ext?param=中文你把它传入你的InitChineseUrl方法看看会发生什么?第一行就出错了——Invalid URI: The URI scheme is not valid. 还是那句话,回答之前,多测试一下自己的代码。=========说了半天,我也没回答楼主的问题——我认为\301\254这样的输出与抓包工具有关。
      

  12.   

    参考:手把手教你HTTP协议之POST方法
    www.wantsoft.com/article/45.htm