У меня есть это веб-приложение в JSP, работающее на сервере приложений JBoss. Я использую Сервлеты для дружественных URL. Я отправляю параметры поиска через свои JSP и сервлеты. Я использую форму с текстовым полем, сервлет
Первый сервлет использует 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 (см. Рассматриваемые заголовки).
Я напечатал кодировку символов сервлетов на консоли, которые по умолчанию были нулевыми, установил для них UTF-8, как сказали @kgiannakakis и @saua.
Ни одно из этих действий не решает проблему. Интересно, а с этим еще что-то не так ...





Во-первых, я не знаю, как решить эту проблему с помощью как, поскольку я мало знаю о Java и JSP.
Сказав это: символы в правой части вашей таблицы - это кодировка UTF-8 левой стороны. То есть где-то в вашем коде вы интерпретируете байты как Latin-1 (или любую другую кодировку по умолчанию), где они фактически представляют символы в кодировке UTF-8 ...
Просто дикая догадка. Попробуйте это внутри своего JSP / сервлета:
if (request.getCharacterEncoding() == null) {
request.setCharacterEncoding("UTF-8");
}
Вы должны быть уверены, что сервлету передана правильная кодировка.
Я думаю, проблема может заключаться в том, что браузер не указывает сообщение формы как utf-8. В Интернете можно много прочитать о сообщениях форм и кодировках, несколько веб-фреймворков предоставляют фильтры кодировки символов для «исправления» этой проблемы, возможно, так же, как ваша идея для исправления - см., Например, http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/filter/CharacterEncodingFilter.html
Проблема в том, что информация, отправляемая браузером, не имеет четко определенной кодировки, и в HTTP нет способа указать ее.
К счастью, большинство браузеров будут использовать кодировку страницы, содержащей форму. Поэтому, если вы используете UTF-8 на всех своих страницах, большинство браузеров также будут отправлять все данные в кодировке UTF-8 (и ваши примеры показывают, что именно так они отправляются).
К сожалению, наиболее распространенные серверы приложений Java на самом деле не справляются с этим случаем (не могу их винить, все равно это в основном догадки).
Вы можете указать серверу приложений обрабатывать любой ввод как UTF-8, вызвав
request.setCharacterEncoding("UTF-8");
В зависимости от вашего стиля кодирования и используемых вами фреймворков может быть слишком поздно, когда поток управления достигнет вашего кода, поэтому, возможно, это можно будет сделать в javax.servlet.Filter.
Проверьте настройку коннектора в вашей конфигурации tomcat. Существует опция (URIEncoding), которую вы можете настроить для обработки URI как UTF-8. По умолчанию они обрабатываются как ISO-8859-1.
У нас была похожая проблема. Это было решено, когда все JSP были сохранены в спецификации UTF-8.
Попробуйте установить 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" />
У меня это тоже сработало. Много чего перепробовала. Только это сработало. Спасибо!
Он также работает с Apache Tomcat: $ CATALINA_BASE / conf / server.xml
Вы используете RequestDumper? Если он настроен в deploy / jboss-web.deployer / server.xml, попробуйте удалить его, а затем проверьте свою кодировку.
см. также stackoverflow.com/a/35505560/1915920 "Как установить кодировку символов контейнера tomcat 8 для запроса и ответа на UTF-8 вместе с ISO-8859-1"
response.setCharacterEncoding ("UTF-8");
Если вы посмотрите внимательно, этот ответ еще не был дан правильно, поэтому мой пост. Йоахим Зауэр предложил использовать request.setCharacterEncoding (...), который не решает проблему. На самом деле это response.setCharacterEncoding (...), который вам нужно использовать, поскольку это ответ, который требует настройки, а не запрос! Меня тоже почти поймали !!
Есть три уровня для настройки. Судя по тому, что вы описали, ваша проблема заключается в конфигурации базы данных.
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 Преобразование символов из браузера в базу данных.
Спасибо. У меня это сработало. Но у меня JBoss 5.1.0.GA, поэтому мой путь был "{jboss.server} /deploy/jbossweb.sar/server.xml"