C# WebRequest。创建不正确的解码url
我有这样一个url:C# WebRequest。创建不正确的解码url,c#,unicode,webrequest,C#,Unicode,Webrequest,我有这样一个url:http://localhost:8080/search.json?q=L%u00e6r,这是Lær的编码搜索 不幸的是,使用WebRequest从该url创建WebRequest。Create(url)会生成以下url:http://localhost:8080/search.json?q=L%25u00e6r 请注意,它错误地解码%u00e6,并生成%25u00e6r。有没有办法转换这种unicode转义值或获取WebRequest.Create以正确处理它 这很可能会作
http://localhost:8080/search.json?q=L%u00e6r
,这是Lær的编码搜索
不幸的是,使用WebRequest从该url创建WebRequest。Create(url)
会生成以下url:http://localhost:8080/search.json?q=L%25u00e6r
请注意,它错误地解码%u00e6
,并生成%25u00e6r
。有没有办法转换这种unicode转义值或获取WebRequest.Create以正确处理它
这很可能会作为一个bug报告给.net团队WebRequest.Create()
如果查询包含§、æ、ø或å(或任何其他非ascii字符),则无法使用Request.QueryString.ToString()返回的查询字符串。下面是一个小的mvc操作,可以用来测试它。用查询调用它query?q=L%C3A6r
public ActionResult Query()
{
var query = Request.QueryString.ToString();
var url = "http://localhost:8080?" + query;
var request = WebRequest.Create(url);
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
return new FileStreamResult(stream, "text/plain");
}
}
编辑:
不幸的是@animaonline的解决方案不适用于http://localhost:8080/search.json?q=Lek+%26+L%u00e6r
,解码为http://localhost:8080/search.json?q=Lek &Lær
,其中WebRequest.Create
对和感到困惑,认为它将参数分开,在执行Create之前,您必须解码URL,而不是作为参数q
的一部分
var decodedUrl = HttpUtility.UrlDecode("http://localhost:8080/search.json?q=L%u00e6r");
var req = WebRequest.Create(decodedUrl);
解决方案似乎是将查询字符串拆分为每个单独的组件,对其进行解码,然后将其重新编码为UTF-8,然后再将其全部合并在一起
string FixQuery(string query){
return String.Join("&",
query.Split(new[] {'&'})
.Select(
p =>
String.Join("=",
p.Split(new[] {'='})
.Select(
q =>
HttpUtility.UrlEncode(
HttpUtility.UrlDecode(q),
Encoding.UTF8
)
)
)
)
);
}
//example usage
var url = "http://localhost:8080/search?"+FixQuery(query);
如果你没有编码就传递它,它肯定会为你编码吗?我没有创建url,它是由第三方提供给应用程序的。现在我需要对同一个第三方使用url。它可以在浏览器中工作,但不能在C#啊,好吧!试试@anomeaonline的解决方案,它对我来说是一个非常好的解决方案!嗨/嗨,马吕斯,我的解决方案到底对你有用吗?(既然你接受了它)?:)你发过错误报告了吗?在Visual Studio 2013中,我仍然存在同样的问题。我更新了问题,以反映为什么不幸的是,此方法不适用于使用.NET 3.5的用户。此解决方案有效,但您必须将第二个参数包装到每个字符串中。在parens和.ToArray()中加入整个问题。