Mar*_*ius 5 c# unicode webrequest
我有一个这样的网址:http://localhost:8080/search.json?q=L%u00e6r,这是对Lær的编码搜索.
不幸的是,使用此url创建WebRequest WebRequest.Create(url)会产生以下url : http://localhost:8080/search.json?q=L%25u00e6r.
请注意,它错误地解码%u00e6并生成%25u00e6r.有没有办法转换这种unicode转义值或让WebRequest.Create正确处理它?
这很可能会被报告为.net团队的错误.如果查询包含§,æ,ø或å(或任何其他非ascii字符)WebRequest.Create(),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");
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
不幸的是,@ animaonline的解决方案不适http://localhost:8080/search.json?q=Lek+%26+L%u00e6r用于那些被解码的网址http://localhost:8080/search.json?q=Lek & Lær,在这里WebRequest.Create被混淆了&,并认为它将参数分开,而不是参数的一部分q.
您必须在执行Create之前解码您的URL
var decodedUrl = HttpUtility.UrlDecode("http://localhost:8080/search.json?q=L%u00e6r");
var req = WebRequest.Create(decodedUrl);
Run Code Online (Sandbox Code Playgroud)
解决方案似乎是将查询字符串拆分为每个单独的组件,对其进行解码,然后将其重新编码为 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1482 次 |
| 最近记录: |