背景:ASP.NET MVC运行在IIS中,带有UTF-8%编码的URL.
使用标准项目模板和HomeController
中的测试操作,例如:
public ActionResult Test(string id)
{
return Content(id, "text/plain");
}
这适用于大多数编码的UTF-8路由,例如:
http://mydevserver/Home/Test/%e4%ba%ac%e9%83%bd%e5%bc%81
达到了预期的效果京都弁
但是,使用该路由时,请执行以下操作:
http://mydevserver/Home/Test/%ee%93%bb
url被正确接收not次.
旁白:%ee%93%bb
%是编码代码点0xE4FB;基本多语言平面,私有使用区域;但最终——一个有效的unicode代码点;您可以手动或通过以下方式进行验证:
string value = ((char) 0xE4FB).ToString();
string encoded = HttpUtility.UrlEncode(value); // %ee%93%bb
现在,接下来会发生什么取决于web服务器;在VisualStudio开发服务器(又名cassini)上,会收到正确的id
,这是一个长度为1的字符串,包含代码点0xE4FB.
然而,如果我在IIS或IIS Express中这样做,我会得到不同的id
,特别是"î“»"
,代码点:0xEE、0x201C、0xBB.您将立即识别第一个和最后一个作为百分比编码字符串的开始和结束...中间发生了什么?
好:
在我看来,IIS在处理我的url时执行了某种引用翻译.现在这可能在一些场景中使用(我不知道),但是当它在一%编码的UTF-8块中发生时,这肯定是一件坏事.
请注意,HttpContext.Current.Request.Raw
also显示已经发生了这种转换,所以这看起来不像是MVC错误;还要注意Darin的 comments ,强调它在url的路径和查询部分的工作方式不同.
所以(两方):
- 我的分析是否遗漏了unicode/url处理的一些重要细节?
- 我怎么才能修好它呢?(即,使我收到预期的字符)