Кодировка символов JSP - неправильно отображается в JSP, но не в URL: á » á é » é

У меня есть это веб-приложение в 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.

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


person Community    schedule 17.12.2008    source источник


Ответы (10)


Попробуйте установить URIEncoding в {jboss.server}/deploy/jboss-web.deployer/server.xml.

Ex:

<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" />
person Community    schedule 20.03.2009
comment
Спасибо. Это сработало для меня. Но у меня JBoss 5.1.0.GA, поэтому мой путь был {jboss.server}/deploy/jbossweb.sar/server.xml - person crsuarezf; 26.07.2011
comment
Это сработало и для меня. Я пробовал много вещей. Только это сработало. Спасибо! - person sura2k; 25.04.2013
comment
Он также работает с Apache Tomcat: $CATALINA_BASE/conf/server.xml - person CountD; 11.06.2014

Просто дикая догадка. Попробуйте это внутри вашего JSP/Servlet:

if(request.getCharacterEncoding() == null) {
   request.setCharacterEncoding("UTF-8");
}

Вы должны быть уверены, что вашему сервлету передается правильная кодировка.

person kgiannakakis    schedule 17.12.2008

response.setCharacterEncoding("UTF-8");

person Cheesle    schedule 20.09.2010
comment
Если вы посмотрите внимательно, этот ответ еще не был дан правильно, поэтому мой пост. Йоахим Зауэр предложил использовать request.setCharacterEncoding(...), что не решает проблему. На самом деле вам нужно использовать response.setCharacterEncoding(...), поскольку это ответ, который требует настройки, а не запрос! Меня тоже чуть не поймал!! - person Cheesle; 22.09.2010

Проблема в том, что информация, отправляемая браузером, не имеет четко определенной кодировки, и в HTTP нет способа указать ее.

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

К сожалению, наиболее распространенные серверы приложений Java на самом деле не справляются с этим (не могу их винить, в любом случае это в основном догадки).

Вы можете указать серверу приложений обрабатывать любой ввод как UTF-8, вызвав

request.setCharacterEncoding("UTF-8");

В зависимости от вашего стиля кодирования и используемых вами фреймворков может быть слишком поздно, когда поток управления достигнет вашего кода, поэтому это можно сделать в файле javax.servlet.Filter.

person Joachim Sauer    schedule 17.12.2008

Проверьте настройку коннектора в конфигурации вашего tomcat. Существует опция (URIEncoding), которую вы можете настроить для обработки URI как UTF-8. По умолчанию они обрабатываются как ISO-8859-1.

person Community    schedule 18.12.2008

У нас была аналогичная проблема. Это было решено, когда все JSP были сохранены со спецификацией UTF-8.

person Community    schedule 12.01.2009

Во-первых, я понятия не имею, как это решить, так как я мало знаю о Java и JSP.

Сказав это: символы в правой части вашей таблицы представляют собой кодировку UTF-8 с левой стороны. То есть где-то в вашем коде вы интерпретируете байты как Latin-1 (или любую другую кодировку по умолчанию), где они фактически представляют символы в кодировке UTF-8...

person Arnout    schedule 17.12.2008

Я думаю, проблема может заключаться в том, что браузер не указывает, что сообщение формы должно быть utf-8. В Интернете можно много прочитать о сообщениях форм и кодировках, несколько веб-фреймворков предоставляют фильтры кодировки символов, чтобы «исправить» эту проблему, возможно, так же, как и ваша идея исправления - см., Например, http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/filter/CharacterEncodingFilter.html

person Simon Groenewolt    schedule 17.12.2008

Вы используете RequestDumper? Если он настроен в файле deploy/jboss-web.deployer/server.xml, попробуйте удалить его, а затем проверьте свою кодировку.

person mgamer    schedule 15.07.2009
comment
см. также stackoverflow.com/a/35505560/1915920 Как установить кодировку символов контейнера tomcat 8 для запроса и ответа в UTF-8 вместо ISO-8859-1 - person Andreas Covidiot; 04.03.2019

Есть три слоя для настройки. Из того, что вы описали, похоже, что ваша проблема заключается в конфигурации базы данных.

  1. Отображение в браузере и отправка форм

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 преобразование символов из браузера. в базу данных.

person Community    schedule 16.01.2015