Кодировка символов JSP - отображается неправильно в JSP, но не в URL: " - PullRequest
13 голосов
/ 17 декабря 2008

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

EDIT

Спасибо за ваши ответы. Я попробовал несколько вещей, но ничего не устранило проблему.

Вот что я сделал:

  • Я добавил ServletRequestListener, который устанавливает кодировку символов сеанса в UTF-8, и Фильтр для каждого запроса Http, который делает то же самое.

  • Как я уже сказал, все в JSP кодируется с помощью UTF-8 (см. Соответствующие заголовки).

  • Я распечатал кодировку символов сервлетов на консоли, которые по умолчанию были нулевыми, установил их в UTF-8, как @kgiannakakis и @saua.

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

Ответы [ 10 ]

11 голосов
/ 20 марта 2009

Попробуйте установить 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" />
7 голосов
/ 17 декабря 2008

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

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

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

5 голосов
/ 20 сентября 2010

response.setCharacterEncoding ( "UTF-8");

3 голосов
/ 13 января 2009

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

3 голосов
/ 18 декабря 2008

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

3 голосов
/ 17 декабря 2008

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

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

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

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

request.setCharacterEncoding("UTF-8");

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

1 голос
/ 15 июля 2009

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

1 голос
/ 17 декабря 2008

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

1 голос
/ 17 декабря 2008

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

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

0 голосов
/ 16 января 2015

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

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

1009 * JSP *

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>

HTML

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  1. Обработка веб-сервера

1020 * JSP *

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...