Кодировка символов JSP-неправильно отображается в JSP, но не в URL-адресе: "á" Ã é é "Ã ©"
У меня есть это веб-приложение в JSP, запущенном на JBoss Application Server. Я использую сервлеты для дружественных URL-адресов. Я отправляю параметры поиска через мои JSP и сервлеты. Я использую форму с текстовым полем, Servlet
Первый сервлет использует request.getParameter()
для получения текста и отправляет его на другой сервлет с помощью response.sendRedirect
(маскируя URL-адрес для чего-то "дружественного" ). Этот последний сервлет использует request.getRequestDispatcher().forward()
для отправки параметров в JSP "уродливым" способом: searchResults.jsp?searchParameters=Parameters
.
Теперь, когда отображается страница результатов поиска, URL-адрес отображает правильный поисковый запрос с "дружественным URL". Пример: http://site.com/search/My-Search-Query
даже при использовании специальных символов, таких как: http://site.com/search/Busqué-tildes-y-eñies
. Но когда я пытаюсь использовать этот термин поиска в своем JSP, специальные символы отображаются неправильно.
Вся система использует i18n, и до сих пор у нас не было проблем со специальными символами. Но когда информация отправляется через форму (скажем, из index.jsp в searchResults.jsp), специальные символы отображаются неправильно:
á - á
é - é
í - Ã
ó - ó
ú - ú
ñ - ñ
Вся база кода должна находиться в UTF-8, но, видимо, я пропускаю что-то при передаче параметров. Как я уже сказал, они правильно отображаются в URL-адресе, но не внутри JSP.
Я думал о преобразовании этих á
вручную, но я предполагаю, что лучший способ сделать это правильно, используя правильную кодировку. Кроме того, могут появляться новые персонажи, которые я могу не знать прямо сейчас (французский, испанский и т.д.).
На всякий случай, я дам вам знать, что у меня есть эти строки на каждом JSP:
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
ИЗМЕНИТЬ
Спасибо за ваши ответы. Я пробовал несколько вещей, но ничто не устранило проблему.
Вот что я сделал:
-
Я добавил ServletRequestListener, который устанавливает кодировку символов сеанса в UTF-8 и фильтр для каждого запроса Http, который делает то же самое.
-
Как я уже сказал, все в JSP закодировано UTF-8 (см. заголовки, о которых идет речь).
-
Я напечатал кодировку символов Servlets на консоли, которые по умолчанию были пустыми, установили их в UTF-8, например, @kgiannakakis и @saua.
Ни одно из этих действий не устраняет проблему. Мне интересно, если что-то еще не так с этим...
Ответы
Ответ 1
Попробуйте установить URIEncoding в {jboss.server}/deploy/jboss-web.deployer/server.xml.
Пример:
<Connector port="8080" address="${jboss.bind.address}"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />
Ответ 2
Просто дикая догадка. Попробуйте это внутри вашего JSP/сервлета:
if(request.getCharacterEncoding() == null) {
request.setCharacterEncoding("UTF-8");
}
Вы должны быть уверены, что правильная кодировка передается вашему сервлету.
Ответ 3
response.setCharacterEncoding( "UTF-8" );
Ответ 4
Проблема в том, что информация, отправленная браузером, не имеет четко определенной кодировки, и нет способа указать ее в HTTP.
К счастью, большинство браузеров будут использовать кодировку страницы, содержащей форму. Таким образом, если вы используете UTF-8 на всех ваших страницах, большинство браузеров также отправят все данные в кодировке UTF-8 (и ваши примеры показывают, что именно так оно отправлено).
К сожалению, наиболее распространенные серверы приложений Java действительно не справляются с этим делом (не могу винить их, в основном это догадки).
Вы можете указать серверу приложений обрабатывать любой ввод как UTF-8, вызывая
request.setCharacterEncoding("UTF-8");
В зависимости от вашего стиля кодирования и используемых вами фреймворков, возможно, это будет поздно, когда поток управления достигнет вашего кода, поэтому это возможно сделать в javax.servlet.Filter
.
Ответ 5
Проверьте настройку соединителя в вашей конфигурации tomcat. Существует опция (URIEncoding), которую вы можете настроить для обработки URI как UTF-8. По умолчанию они обрабатываются как ISO-8859-1.
Ответ 6
У нас была аналогичная проблема. Он был решен, когда все JSP были сохранены с помощью спецификации UTF-8.
Ответ 7
Во-первых, я понятия не имею, как это решить, поскольку я мало знаю о Java и JSP.
Сказав это: символы в правой части таблицы - это кодировка UTF-8 левой стороны.
То есть, где-то в вашем коде, вы интерпретируете байты как латинские-1 (или что-то другое, чем ваша кодировка по умолчанию), где они фактически представляют кодированные символы UTF-8...
Ответ 8
Я думаю, что проблема может заключаться в том, что браузер не указывает, что сообщение формы должно быть utf-8. Есть много, чтобы прочитать о сообщениях и кодировках формы в Интернете, несколько веб-фреймворков предоставляют фильтры кодировки символов, чтобы "исправить" эту проблему, возможно, так же, как и ваша идея для исправления - см. например http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/filter/CharacterEncodingFilter.html
Ответ 9
Используете ли вы RequestDumper? Если он настроен в deploy/jboss-web.deployer/server.xml, попробуйте удалить его, а затем проверить свою кодировку.
Ответ 10
Существует три слоя для настройки. Из того, что вы описали, похоже, что ваша проблема кроется в конфигурации базы данных.
- Отображение браузера и представление формы
JSP
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
HTML
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- Обработка веб-сервера
JSP
<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("NAME");
%>
То же самое в сервлете. См. Конкретное решение JBoss, а также полное серверное независимое решение в этом ответе.
- Настройки базы данных
Вы можете потерять информацию о символах на уровне базы данных. Проверьте, чтобы ваша кодировка базы данных также была UTF-8, а не ASCII.
Для полного обсуждения этой темы обратитесь к статье Java Преобразование символов из браузера в базу данных.