Контекст: ASP.NET MVC, работающий в IIS, с URL-кодом в кодировке UTF-8%.
Использование стандартного шаблона проекта и тестового действия в 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
с ожидаемым результатом 京都 101
Однако при использовании маршрута:
http://mydevserver/Home/Test/%ee%93%bb
URL-адрес не получен правильно.
В стороне: %ee%93%bb
- кодированная точка% -x 0xE4FB;базовая многоязычная плоскость, зона частного пользования;но в конечном итоге - действительный код Unicode;Вы можете проверить это вручную или с помощью:
string value = ((char) 0xE4FB).ToString();
string encoded = HttpUtility.UrlEncode(value); // %ee%93%bb
Теперь, что будет дальше, зависит от веб-сервера;на сервере разработки Visual Studio (aka cassini) получено правильное id
- строка длиной один, содержащая кодовую точку 0xE4FB.
Если, однако, я делаю это в IIS или IIS Express,Я получаю другой id
, в частности "î“»"
, кодовые точки: 0xEE, 0x201C, 0xBB.Вы сразу узнаете первое и последнее как начало и конец нашей строки, закодированной в процентах ... так что же произошло в середине?
Ну:
Это выглядит мне оченьТак же, как IIS выполнил некий перевод цитат при обработке моего URL.Теперь, возможно, это может быть использовано в нескольких сценариях (я не знаю), но это, конечно, плохо, когда это происходит в середине блока, кодированного% UTF-8.
Обратите внимание, что HttpContext.Current.Request.Raw
также показывает, что этот перевод произошел, так что это не похоже на ошибку MVC;обратите внимание также на комментарий Дарина, подчеркивающий, что он работает по-разному в части пути к URL-адресу запроса.
Итак (с двумя разделителями):
- - в моем анализе отсутствуют некоторые важные тонкостиЮникод / обработка URL?
- как мне это исправить?(т.е. сделать так, чтобы я получил ожидаемый символ)