IE отправляет? символ вместо символов Юникода в HTTP GET

#browser #unicode #internet-explorer-9

#браузер #юникод #internet-explorer-9

Вопрос:

Я создал веб-форму для поиска в одном из своих проектов, и HTML-код довольно прост:

 <form action='/search' method="post">
    <input type="text" id='search-term' name='search-term' />
    <input type="submit" id='start-search' alt='' value="" />
</form>
 

Итак, когда пользователь вводит поисковый запрос в Юникоде и нажимает Enter, HTTP Get запрос будет отправлен на сервер с этим URL:

 http://www.example.com/search?search-term=مثال
 

Это на сервере будет:

 http://www.example.com/search?search-term=مثال
 

и я могу получить декодированное значение строки search-term запроса, используя HttpContext.Current.Server.UrlDecode("مثال") которое возвращается مثال ко мне. Пока здесь все работает нормально, и у меня нет проблем.

Однако, если кто-нибудь введет вышеупомянутый адрес непосредственно в IE9 и нажмет Enter, то на сервере я получаю:

 http://www.example.com/search?search-term=????
 

Что здесь не так?

Обновление: мы проверили трафик через Fiddler, и вы можете увидеть результат на следующих рисунках:

Заголовки HTTP Get, захваченные Fiddler, запрошенные с помощью Firefox Заголовки HTTP Get, захваченные Fiddler

Заголовки HTTP Get, захваченные Fiddler, запрошенные с помощью IE Заголовки HTTP Get, захваченные Fiddler

Комментарии:

1. Смешивание одинарных и двойных кавычек в HTML … почему так неаккуратно?

2. Нет @MattBall, это то, что я написал здесь. Но вы правы. Единый подход работает лучше. Да здравствует согласованность!

3. Кто сказал, что это IE9? Вы использовали Fiddler или что-то еще для захвата того, что отправляет IE, возможно, ваш сервер не понимает запрос.

4. Я использовал Firebug, чтобы увидеть, что отправляет IE, и в Firebug все в порядке. Но на сервере (в самой начальной точке или context_BeginRequest) символы такие же, как ???? .

5. Хорошо, ваш вопрос должен быть «HTTP-сервер и символы Юникода»

Ответ №1:

IE не знает, какую кодировку вы хотите использовать при вводе URL вручную, поэтому он должен использовать кодировку по умолчанию. ? символы возникают, когда символы Юникода преобразуются в кодировку Ansi, которая не поддерживает эти символы Юникода. При отправке веб-формы вместо этого IE использует кодировку веб-формы, которая может быть указана самим <form> тегом, в <meta> тегах в HTML-документе или Content-Type в заголовке HTTP, поэтому меньше шансов, что IE должен угадать правильную кодировку для использования.