5

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

不幸的是,从这个 url 创建一个 WebRequestWebRequest.Create(url)会产生以下 url: http://localhost:8080/search.json?q=L%25u00e6r

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

这很可能会作为错误报告给 .net 团队。如果查询包含 §、æ、ø 或 å(或任何其他非 ascii 字符),WebRequest.Create()则无法使用返回的查询字符串。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 的解决方案不适用于 url 之类http://localhost:8080/search.json?q=Lek+%26+L%u00e6r的,这些 url 被解码为http://localhost:8080/search.json?q=Lek & Lær,其中WebRequest.Create混淆了&,并认为它分隔了参数,而不是作为参数的一部分q

4

2 回答 2

5

您必须在执行创建之前解码您的 URL

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

        var req = WebRequest.Create(decodedUrl);
于 2013-04-02T09:31:52.547 回答
3

解决方案似乎是将查询字符串拆分为每个单独的组件,对其进行解码,然后将其重新编码为 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);
于 2013-04-03T08:12:38.613 回答