当从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+Bild+f%u00fcr+andere+freigeben
我试过使用Encoding.UTF8
,Encoding.ASCII
和Encoding.Default
,它们都产生相同的结果。我可以做些什么来达到我想要的UrlEncoding格式:
text=ich%20m%C3%B6chte%20diese%20Bild%20f%C3%BCr%20andere%20freigeben
一如既往,提前感谢您的帮助/建议!
4条答案
按热度按时间tyu7yeag1#
问题在于:
HttpUtility.ParseQueryString
返回一个NameValueCollection
,但实际上是一个名为HttpValueCollection
的内部类。这个类覆盖了ToString()
方法。它生成一个编码的查询字符串,但对于其URL编码,它使用HttpUtility.UrlEncodeUnicode
(tinyurl.com/HttpValue)。这将产生% u值。如果您需要不同类型的URL编码,您可能希望避免
HttpUtility.ParseQueryString
或解码ToString()
的结果并随后对其进行编码:pdkcd3nj2#
这个问题很老了,但是我在研究这个问题的时候发现它缺少一个有效的答案。
修复相当简单,只需在
web.config
中添加以下设置(在.NET 4.5中测试和工作):将此值设置为true可控制.NET如何对URL中的某些字符进行编码。特别是像ä、ë、<$等字符。我想这可能是因为这些字符有几种编码方式。通常的做法是使用前缀
%C3
,表示下面的字符有一个元音变音(我相当肯定它是如何工作的)。HttpUtility.ParseQueryString
在默认情况下执行此操作的方式不同。它将字符编码为实际的百分比编码unicode字符%u00f6
。这可能会导致一些问题,因为即使在.NET本身中也不是默认值,例如HttpUtility.UrlEncode
将其编码为%C3%B6
。更改上述设置将确保两个方法返回类似的结果。gpnt7bae3#
我不熟悉ParseQueryString,但从文档中可以看出它可以将格式正确的查询转换为名称/值对。从你的文章中,你似乎在做相反的事情:将数据对转换为适当格式的查询。相反,您可以尝试使用HttpUtility.UrlEncode
e5njpo684#
用途:System.Web.HttpUtility.ParseQueryString(Request.Url.Query,UTF8Encoding.Default)
例如:www.mydomain.com/page?name=Jia+Almi%F1a&PAYID=123456&TOWN=LONDON
真实姓名:贾·阿尔米亚
Request.Querystring[“name”]:Jia Almièa(这是不正确的)
首先获取原始url,它将是Request.Url.Query:?name=Jia+Almi%F1a&PAID=123456&TOWN=伦敦
System.Web.HttpUtility.ParseQueryString(Request.Url.Query,UTF8Encoding.Default).Get(“name”)将为Jia Almiña