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

时间:2014-11-06 20:52:38

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

当使用来自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

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

4 个答案:

答案 0 :(得分:14)

问题在于:

urlBuilder.Query = query.ToString();

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

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

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

答案 1 :(得分:7)

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

修复非常简单,在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。更改上述设置将确保两种方法都返回类似的结果。

答案 2 :(得分:1)

我不熟悉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();

答案 3 :(得分:0)

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

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

实际名称:贾阿尔米娜

Request.Querystring [“ name”]:贾阿米(不正确)

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

System.Web.HttpUtility.ParseQueryString(Request.Url.Query,UTF8Encoding.Default).Get(“ name”)将是加阿尔米尼亚(AiAlmiña)