UTF-8, кодирующий отправку формы сервлета с Tomcat - PullRequest
8 голосов
/ 06 декабря 2011

Я пытаюсь опубликовать простую форму, содержащую символы Юникода, для действия сервлета.На Джетти все работает без препятствий.На сервере Tomcat искажаются символы utf-8.

Простейший случай, который у меня есть:

Форма:

<form action="action" method="post">
  <input type="text" name="data" value="It’s fine">`
</form>`

Действие:

class MyAction extends ActionSupport {   
  public void setData(String data) {
    // data is already mangled here in Tomcat
  } 
}
  • У меня есть URIEncoding = "UTF-8" на <Connector> в server.xml
  • Первый фильтр в действии вызывает request.setCharacterEncoding ("UTF-8");
  • Тип содержимого страницы, которая содержит форму: «text / html; charset = UTF-8»
  • Добавление «accept-charset» к форме не имеет значения

Единственный способ заставить его работать - использовать Jetty или переключить его на method = "get".И то и другое заставляет персонажей проходить без проблем.

1 Ответ

17 голосов
/ 06 декабря 2011

У меня есть URIEncoding = "UTF-8" на <Connector> в server.xml

Это относится только к запросам GET.


Первый фильтр в действии вызывает request.setCharacterEncoding("UTF-8");

Хорошо, это должно применяться к запросам POST. Вам нужно только убедиться, что если вы еще не позвонили getParameter(), getReader(), getInputStream() или что-либо еще, что могло бы вызвать синтаксический анализ тела запроса до вызова setCharacterEncoding().


Тип содержимого страницы, содержащей форму: "text/html; charset=UTF-8"

Как точно вы его настраиваете? Если это сделано в <meta>, то вы должны понимать, что это игнорируется браузером, когда страница обслуживается по HTTP и присутствует заголовок ответа HTTP Content-Type. Средний веб-сервер уже устанавливает его по умолчанию. Тип контента <meta> будет использоваться только в том случае, если страница сохранена на локальный диск и оттуда просмотрена.

Чтобы правильно установить кодировку заголовка ответа, добавьте в начало JSP следующее:

<%@page pageEncoding="UTF-8" %>

Это, кстати, также скажет серверу отправить ответ в данной кодировке.


Добавление "accept-charset" к форме не имеет значения

Это имеет значение только в MSIE, но даже тогда он использует его неправильно. В целом атрибут ничего не стоит. Забудь об этом.

Смотри также:

...