【问题标题】:HttpUtility.ParseQueryString() always encodes special characters to unicodeHttpUtility.ParseQueryString() 总是将特殊字符编码为 un​​icode
【发布时间】:2014-11-06 20:52:37
【问题描述】:

当使用 System.Web 中的 HttpUtility 时,我发现每次调用 .ParseQueryString 方法时,我都会将特殊字符编码为它们的 unicode 等效表示。我尝试了许多不同的编码类型,似乎都产生了相同的结果。我的代码示例如下:

string text = "ich möchte diese Bild für andere freigeben"
var urlBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(urlBuilder.Query, Encoding.UTF8);
query["text"] = text;    
urlBuilder.Query = query.ToString();
string finalUrl = urlBuilder.ToString();

finalUrl 中我会收到的字符串是:

text=ich+m%u00f6chte+diese+Bild+f%u00fcr+andere+freigeben

我尝试过使用Encoding.UTF8Encoding.ASCIIEncoding.Default,它们都产生了相同的结果。我该怎么做才能达到我想要的 UrlEncoding 格式:

text=ich%20m%C3%B6chte%20diese%20Bild%20f%C3%BCr%20andere%20freigeben

一如既往,提前感谢您的帮助/建议!

【问题讨论】:

  • 你会推荐什么?
  • 作为旁注,您可能希望将它们显示为未编码,但 URL 规范清楚地表明它们应该被编码。 ietf.org/rfc/rfc1738.txt(第 2 页标记周围)
  • 不是我不想对它们进行编码,而是我希望它显示为标准 url 编码与 unicode 编码。

标签: c# asp.net http query-string


【解决方案1】:

问题出在:

urlBuilder.Query = query.ToString();

HttpUtility.ParseQueryString 返回一个NameValueCollection,但实际上是一个名为HttpValueCollection 的内部类。此类覆盖了ToString() 方法。它生成一个编码的查询字符串,但它的 URL 编码使用HttpUtility.UrlEncodeUnicode (tinyurl.com/HttpValue)。这会产生 %uXXXX 值。

如果您需要不同类型的 URL 编码,您可能希望避免使用 HttpUtility.ParseQueryString 或解码 ToString() 的结果并在之后对其进行编码:

urlBuilder.Query = Uri.EscapeUriString(HttpUtility.UrlDecode(query.ToString()));

【讨论】:

    【解决方案2】:

    这个问题相当老了,但我只是在研究这个问题时遇到了它,发现它缺少一个有效的答案。

    修复相当简单,只需在 web.config 中添加以下设置(在 .NET 4.5 中测试并工作):

    <appSettings>
      <add key="aspnet:DontUsePercentUUrlEncoding" value="true" />
    </appSettings>
    

    将此值设置为 true 可控制 .NET 如何对 URL 中的某些字符进行编码。特别是 ä、ë、ö 等字符。我认为这可能是因为这些字符有多种编码方式。通常这样做的方式是使用前缀%C3,它表示后面的字符有一个变音符号(我很确定它是这样工作的)。

    HttpUtility.ParseQueryString 默认的做法是不同的。它将字符编码为实际百分比编码的 unicode 字符%u00f6。这可能会导致一些问题,因为即使在 .NET 本身中它也不是默认设置,例如 HttpUtility.UrlEncode 会将其编码为 %C3%B6。更改上述设置将确保两种方法返回相似的结果。

    【讨论】:

      【解决方案3】:

      我不熟悉 ParseQueryString,但从文档中可以看出,它可以将格式正确的查询转换为名称值对。从您的帖子看来,您正试图做相反的事情:将数据对转换为格式正确的查询。相反,您可以尝试使用 HttpUtility.UrlEncode

      string text = "ich möchte diese Bild für andere freigeben"
      var urlBuilder = new UriBuilder(url);
      String query = "text=" + HttpUtility.UrlEncode(text);  
      urlBuilder.Query = query;
      string finalUrl = urlBuilder.ToString();
      

      【讨论】:

        【解决方案4】:

        使用:System.Web.HttpUtility.ParseQueryString(Request.Url.Query, UTF8Encoding.Default)

        例如:www.mydomain.com/page?name=Jia+Almi%F1a&PAYID=123456&TOWN=LONDON

        本名:贾·阿尔米尼亚

        Request.Querystring["name"]: Jia Almi�a(不正确)

        首先获取原始网址,它将是 Request.Url.Query: ?name=Jia+Almi%F1a&PAID=123456&TOWN=LONDON

        System.Web.HttpUtility.ParseQueryString(Request.Url.Query, UTF8Encoding.Default).Get("name") 将是 Jia Almiña

        【讨论】:

          猜你喜欢
          • 2014-03-13
          • 2016-08-21
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 1970-01-01
          • 2018-01-29
          • 2023-04-07
          • 1970-01-01
          相关资源
          最近更新 更多