HttpUtility.ParseQueryString()始终将特殊字符编码为unicode

当我从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中的字符串将是:

文本= ICH + M%u00f6chte + diese +图片报+ F%u00fcr + ANDERE + freigeben

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

文本= ICH%20米%C3%B6chte%20diese%20Bild%20F%C3%BCR%20andere%20freigeben

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

问题在于:

 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())); 

这个问题相当陈旧,但我在研究这个问题时遇到了它,并注意到它缺少一个有效的答案。

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

    

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

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

我不熟悉ParseQueryString,但是从文档中可以看出将格式正确的查询转换为名称值对。 从您的post看来,您正试图做相反的事情:将数据对转换为格式正确的查询。 相反,您可以尝试使用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();