Контекст: 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
с ожидаемым результатом 京都 弁
Однако используя маршрут:
http://mydevserver/Home/Test/%ee%93%bb
URL-адрес получен неверно.
Кроме того: %ee%93%bb
- это% -кодированная кодовая точка 0xE4FB; базовый-многоязычный самолет, частный сектор; но в конечном счете - действительная кодовая точка Юникода; вы можете проверить это вручную или через:
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. Вы сразу узнаете первый и последний как начало и конец нашей кодированной в процентах строки... так что произошло в середине?
Ну:
Мне очень нравится, что при обработке моего URL-кода IIS выполнял какой-то котировочный перевод. Теперь, возможно, это может быть использовано в нескольких сценариях (я не знаю), но это, конечно, плохо, когда это происходит в середине блока с кодировкой% -encoded UTF-8.
Обратите внимание, что HttpContext.Current.Request.Raw
также показывает, что этот перевод произошел, поэтому это не похоже на ошибку MVC; обратите внимание также на комментарий Дарина, подчеркнув, что он работает по-разному в пути к части запроса URL-адреса.
Итак (двухпартер):
- В моем анализе отсутствует какая-то важная тонкость обработки unicode/url?
- Как я могу это исправить? (т.е. сделать так, чтобы я получил ожидаемый символ)