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

xwbd5t1u  于 12个月前  发布在  .NET
关注(0)|答案(4)|浏览(124)

当从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.UTF8Encoding.ASCIIEncoding.Default,它们都产生相同的结果。我可以做些什么来达到我想要的UrlEncoding格式:
text=ich%20m%C3%B6chte%20diese%20Bild%20f%C3%BCr%20andere%20freigeben
一如既往,提前感谢您的帮助/建议!

tyu7yeag

tyu7yeag1#

问题在于:

urlBuilder.Query = query.ToString();

HttpUtility.ParseQueryString返回一个NameValueCollection,但实际上是一个名为HttpValueCollection的内部类。这个类覆盖了ToString()方法。它生成一个编码的查询字符串,但对于其URL编码,它使用HttpUtility.UrlEncodeUnicode(tinyurl.com/HttpValue)。这将产生% u值。
如果您需要不同类型的URL编码,您可能希望避免HttpUtility.ParseQueryString或解码ToString()的结果并随后对其进行编码:

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

pdkcd3nj2#

这个问题很老了,但是我在研究这个问题的时候发现它缺少一个有效的答案。
修复相当简单,只需在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。更改上述设置将确保两个方法返回类似的结果。

gpnt7bae

gpnt7bae3#

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

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

相关问题