Простой файл 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-заголовок запроса сообщения будет содержать a Content-Type:application/x-www-form-urlencoded
поле, но набор символов будет опущено (протестированный с FF3.6 и IE8).
Проблемой является сервер приложений, который я использую (Tomcat6), ожидает набор символов в заголовке Типа контента (как указано в RFC2388). Как это: Content-Type:application/x-www-form-urlencoded;charset=utf-8
. Если набор символов будет опущен, то он примет ISO-8859-1, который не является набором символов, используемым для кодирования. Результатом являются поврежденные данные.
У кого-то есть подсказка, как вынудить текущие браузеры добавить набор символов к заголовку Типа контента?
Кто-нибудь знает, как заставить текущие браузеры добавлять кодировку в заголовок Content-Type?
Нет, ни в одном браузере никогда не было предоставил параметр charset
с типом носителя application / x-www-form-urlencoded
. Более того, спецификация HTML, определяющая этот тип, не предлагает параметр charset
, поэтому сервер не может разумно ожидать его получения.
(HTML4 ожидает кодировки
для частей представления multipart / form-data
, но даже в этом случае ни один браузер на самом деле не соответствует).)
accept-charset = "utf-8"
accept-charset
не работает в IE и не должен использоваться.В любом случае это не повлияет на формы на страницах, обслуживаемых как UTF-8, но в других случаях это может привести к противоречивым результатам.
Нет, с формами вы просто должны обслуживать страницу, в которой они находятся, как UTF-8, а результаты должны возвращаться как UTF-8 (без каких-либо опознавательных знаков, чтобы сообщить вам об этом (за исключением потенциально _charset_
взломать , но Tomcat не поддерживает это).
Таким образом, вы должны указать контейнеру сервлетов, какую кодировку использовать для параметров, если вы не хотите, чтобы он возвращался к значениям по умолчанию (которые обычно неверно). В ограниченном наборе обстоятельств вы можете вызвать ServletRequest.setCharacterEncoding ()
, чтобы сделать это, но это имеет тенденцию быть хрупким и вообще не работает для параметров, взятых из строка запроса. К сожалению, для этого не существует стандартизированного исправления на уровне сервлета. Для Tomcat обычно приходится возиться с server.xml вместо того, чтобы исправлять его в приложении.