2014-11-06 78 views
11

当从System.Web使用HttpUtility时,我发现每次调用方法.ParseQueryString时,我都将特殊字符编码为它们的unicode等效表示形式。我已经尝试了许多不同的编码类型,并且都似乎产生了相同的结果。我的代码的一个例子是在这里: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.Default,他们都产生相同的结果尝试。我能做些什么,以达到我想要的URL编码的格式:

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

像往常一样,在此先感谢您的帮助/建议!

+0

你会推荐什么? – tezromania 2014-11-06 20:56:37

+0

正如一个侧面说明,你可能想要显示它们为非编码,但URL规范清楚地表明这些应该被编码。 https://www.ietf.org/rfc/rfc1738.txt(在第2页附近) – Nathan 2014-11-06 21:46:43

+0

它不是我不想编码它,它是我希望它显示为标准的url编码与unicode编码。 – tezromania 2014-11-06 21:49:10

回答

1

我对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(); 
13

的问题是:

urlBuilder.Query = query.ToString(); 

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

如果你需要不同类型的URL编码,你可能想避免HttpUtility.ParseQueryStringToString()结果进行解码并随后对其进行编码:

urlBuilder.Query = Uri.EscapeUriString(HttpUtility.UrlDecode(query.ToString())); 
5

这个问题是比较旧的,但我只是碰到它,而研究这个问题并注意到它缺少一个有效的答案。

解决方法是相当简单的,在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。更改上述设置将确保这两种方法返回类似的结果。