Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebRequest。创建不正确的解码url_C#_Unicode_Webrequest - Fatal编程技术网

C# WebRequest。创建不正确的解码url

C# WebRequest。创建不正确的解码url,c#,unicode,webrequest,C#,Unicode,Webrequest,我有这样一个url:http://localhost:8080/search.json?q=L%u00e6r,这是Lær的编码搜索 不幸的是,使用WebRequest从该url创建WebRequest。Create(url)会生成以下url:http://localhost:8080/search.json?q=L%25u00e6r 请注意,它错误地解码%u00e6,并生成%25u00e6r。有没有办法转换这种unicode转义值或获取WebRequest.Create以正确处理它 这很可能会作

我有这样一个url:
http://localhost:8080/search.json?q=L%u00e6r
,这是Lær的编码搜索

不幸的是,使用
WebRequest从该url创建WebRequest。Create(url)
会生成以下url:
http://localhost:8080/search.json?q=L%25u00e6r

请注意,它错误地解码
%u00e6
,并生成
%25u00e6r
。有没有办法转换这种unicode转义值或获取WebRequest.Create以正确处理它

这很可能会作为一个bug报告给.net团队
WebRequest.Create()
如果查询包含§、æ、ø或å(或任何其他非ascii字符),则无法使用
Request.QueryString.ToString()返回的查询字符串。下面是一个小的mvc操作,可以用来测试它。用查询调用它
query?q=L%C3A6r

public ActionResult Query()
{
    var query = Request.QueryString.ToString();
    var url = "http://localhost:8080?" + query;


    var request = WebRequest.Create(url);
    using (var response = request.GetResponse())
    using (var stream = response.GetResponseStream())
    {
        return new FileStreamResult(stream, "text/plain");
    }
}
编辑


不幸的是@animaonline的解决方案不适用于
http://localhost:8080/search.json?q=Lek+%26+L%u00e6r
,解码为
http://localhost:8080/search.json?q=Lek &Lær
,其中
WebRequest.Create
感到困惑,认为它将参数分开,在执行Create之前,您必须解码URL,而不是作为参数
q

的一部分

        var decodedUrl = HttpUtility.UrlDecode("http://localhost:8080/search.json?q=L%u00e6r");

        var req = WebRequest.Create(decodedUrl);

解决方案似乎是将查询字符串拆分为每个单独的组件,对其进行解码,然后将其重新编码为UTF-8,然后再将其全部合并在一起

string FixQuery(string query){
  return String.Join("&",
    query.Split(new[] {'&'})
      .Select(
        p =>
          String.Join("=",
            p.Split(new[] {'='})
              .Select(
                q =>
                  HttpUtility.UrlEncode(
                    HttpUtility.UrlDecode(q),
                    Encoding.UTF8
                  )
              )
          )
      )
  );
}

//example usage

var url = "http://localhost:8080/search?"+FixQuery(query);

如果你没有编码就传递它,它肯定会为你编码吗?我没有创建url,它是由第三方提供给应用程序的。现在我需要对同一个第三方使用url。它可以在浏览器中工作,但不能在C#啊,好吧!试试@anomeaonline的解决方案,它对我来说是一个非常好的解决方案!嗨/嗨,马吕斯,我的解决方案到底对你有用吗?(既然你接受了它)?:)你发过错误报告了吗?在Visual Studio 2013中,我仍然存在同样的问题。我更新了问题,以反映为什么不幸的是,此方法不适用于使用.NET 3.5的用户。此解决方案有效,但您必须将第二个参数包装到每个字符串中。在parens和.ToArray()中加入整个问题。