Я конвертирую старое приложение из ISO-8859-1 в UTF-8, и я использовал ряд ресурсов, чтобы определить, что мне нужно установить, чтобы заставить это работать. Однако после нескольких изменений конфигурации, кода и среды мой сервлет (в Tomcat 5), похоже, не обрабатывает отправленное содержимое HTML-формы как UTF-8.
Вот что я настроил для настройки.
[user@server ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
<Connector protocol="HTTP/1.1"
...
URIEncoding="UTF-8"
useBodyEncodingForURI="true"/>
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
...
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
{
if(request.getCharacterEncoding() == null)
{
request.setCharacterEncoding("UTF-8");
}
...
С некоторыми журналами отладки я знаю следующее:
System.getProperty("file.encoding"): "UTF-8"
java.nio.charset.Charset.defaultCharset(): "UTF-8"
new OutputStreamWriter(new ByteArrayOutputStream()).getEncoding(): "UTF8"
Однако, когда я отправляю свою форму со входом, содержащим «Бить баклуши», я вижу следующее (из моих журналов):
request.getParameter("myParameter") = Ð\221иÑ\202Ñ\214 баклÑ\203Ñ\210Ð
Я знаю, что тип содержимого запроса был null
, поэтому он был явно установлен на "UTF-8" в моем фильтре сервлетов. Кроме того, я просматриваю свои логи с терминала, кодировка которого, как мне известно, также установлена на UTF-8.
Что мне здесь не хватает? Что еще нужно настроить, чтобы сервлет корректно обрабатывал мой ввод как UTF-8? Если вам поможет дополнительная информация, я буду рад добавить отладку и обновить этот вопрос вместе с ним.
Edit:
- Я не использую Windows Terminal (я использую PuTTY), поэтому я уверен, что проблема не в том, с чем я просматриваю логи. Это подтверждается тем фактом, что когда я отправляю свой ответ обратно в браузер с отправленным контентом и выводю его, это тот же мусор, что и выше.
- Форма отправляется из IE8.
Решение:
Мое web.xml
определение для моего CharsetFilter было слишком далеко (ниже конфигураций моего сервлета и других фильтров). Я переместил определение фильтра в самый верх документа web.xml, и все заработало правильно. Смотрите принятый ответ ниже.