Подтвердить что ты не робот

Кодировка символов 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.

Ни одно из этих действий не устраняет проблему. Мне интересно, если что-то еще не так с этим...

4b9b3361

Ответ 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">
  1. Обработка веб-сервера

JSP

<%
  request.setCharacterEncoding("UTF-8");
  String name = request.getParameter("NAME");
%>

То же самое в сервлете. См. Конкретное решение JBoss, а также полное серверное независимое решение в этом ответе.

  1. Настройки базы данных

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

Для полного обсуждения этой темы обратитесь к статье Java Преобразование символов из браузера в базу данных.