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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
0
30 334
10

Ответы 10

Во-первых, я не знаю, как решить эту проблему с помощью как, поскольку я мало знаю о 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" />

Спасибо. У меня это сработало. Но у меня JBoss 5.1.0.GA, поэтому мой путь был "{jboss.server} /deploy/jbossweb.sar/server.xml"

crsuarezf 26.07.2011 01:30

У меня это тоже сработало. Много чего перепробовала. Только это сработало. Спасибо!

sura2k 25.04.2013 13:19

Он также работает с Apache Tomcat: $ CATALINA_BASE / conf / server.xml

CountD 11.06.2014 03:23

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

см. также stackoverflow.com/a/35505560/1915920 "Как установить кодировку символов контейнера tomcat 8 для запроса и ответа на UTF-8 вместе с ISO-8859-1"

Andreas Covidiot 04.03.2019 12:58

response.setCharacterEncoding ("UTF-8");

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

Cheesle 22.09.2010 18:37

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

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

Другие вопросы по теме