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.UTF8
, Encoding.ASCII
和Encoding.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();