C# · 12月 29, 2021

c# – 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中的字符串将是:

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

我已经尝试使用Encoding.UTF8,Encoding.ASCII和Encoding.Default,它们都产生相同的结果.我可以做什么来达到我想要的格式的UrlEncoding:

text=ich%20m%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()));