Подтвердить что ты не робот

Как заставить браузер установить кодировку в HTTP-заголовке контента

Простой HTML файл:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form method="POST" action="test.jsp" accept-charset="utf-8" method="post" enctype="application/x-www-form-urlencoded" >
    <input type="text" name="P"/>
    <input type="submit" value="subMit"/>
</form>
</body>
</html>

HTML файл обслуживается сервером с помощью заголовка Content-Type:text/html; charset=utf-8. Все говорит: "Уважаемый браузер, когда вы публикуете эту форму, пожалуйста, напишите" utf-8 encoded ". На самом деле браузер делает это. Каждое значение, введенное в поле ввода, будет кодироваться UTF-8. НО браузер не сообщит об этом серверу! HTTP-заголовок почтового запроса будет содержать поле Content-Type:application/x-www-form-urlencoded, но кодировка будет опущена (протестирована с FF3.6 и IE8).

Проблема заключается в том, что сервер приложений, который я использую (Tomcat6), ожидает кодировку в заголовке Content-Type (как указано в RFC2388). Пример: Content-Type:application/x-www-form-urlencoded;charset=utf-8. Если кодировка опущена, она будет считать ISO-8859-1, которая не является кодировкой, используемой для кодирования. Результатом являются неработающие данные.

Есть ли у кого-нибудь подсказка, как заставить текущие браузеры добавлять кодировку к заголовку Content-Type?

4b9b3361

Ответ 1

Есть ли у кого-нибудь подсказка, как заставить текущие браузеры добавлять кодировку к заголовку Content-Type?

Нет, ни один браузер никогда не предоставлял параметр charset с типом application/x-www-form-urlencoded. Более того, спецификация HTML, которая определяет этот тип, не предлагает параметр charset, поэтому сервер не может разумно ожидать его получения.

(HTML4 ожидает, что a charset для подкомпонентов представления multipart/form-data, но даже в этом случае браузер не выполнит.)

Accept-Charset = "UTF-8"

accept-charset нарушается в IE и не следует использовать. Это не будет иметь никакого значения для форм на страницах, обслуживаемых как UTF-8, но в других случаях это может привести к несогласованным результатам.

Нет, с формами вам просто нужно обслуживать страницу, на которой они находятся, как UTF-8, и результаты должны возвращаться как UTF-8 (без идентификационных меток, чтобы сказать вам об этом (кроме потенциально для _charset_ взломать, но Tomcat этого не поддерживает).

Итак, вы должны сообщить контейнеру Servlet, какую кодировку использовать для параметров, если вы не хотите, чтобы он возвращался к своему стандарту (что обычно неправильно). В ограниченном количестве обстоятельств вы можете вызвать ServletRequest.setCharacterEncoding(), чтобы сделать это, но это имеет тенденцию быть хрупким и вообще не работает для параметров, взятых из строки запроса. К сожалению, для этого не существует стандартизированного уровня сервлет-уровня. Для Tomcat вы обычно должны гадать с server.xml вместо того, чтобы исправлять его в приложении.