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

tez*_*nia 14 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();
Run Code Online (Sandbox Code Playgroud)

finalUrl我将从中收到的字符串将是:

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

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

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

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

小智 15

问题在于:

urlBuilder.Query = query.ToString();
Run Code Online (Sandbox Code Playgroud)

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

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

urlBuilder.Query = Uri.EscapeUriString(HttpUtility.UrlDecode(query.ToString()));
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

<appSettings>
  <add key="aspnet:DontUsePercentUUrlEncoding" value="true" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)

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

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


小智 2

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

\n\n
string text = "ich m\xc3\xb6chte diese Bild f\xc3\xbcr andere freigeben"\nvar urlBuilder = new UriBuilder(url);\nString query = "text=" + HttpUtility.UrlEncode(text);  \nurlBuilder.Query = query;\nstring finalUrl = urlBuilder.ToString();\n
Run Code Online (Sandbox Code Playgroud)\n