Как заставить браузер устанавливать кодировку в заголовке http типа контента - PullRequest
12 голосов
/ 10 марта 2010

Простой 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». Браузер фактически делает это. Каждое значение, введенное в поле ввода, будет в кодировке UTF-8. НО браузер не скажет об этом серверу! HTTP-заголовок запроса post будет содержать поле 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?

1 Ответ

11 голосов
/ 10 марта 2010

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

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

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

Accept-Charset = "UTF-8"

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

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

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

...