Как передать символы Юникода как JSP / сервлет request.getParameter?

После долгих проб и ошибок я все еще не могу понять проблему. JSP, сервлет и база данных настроены на прием кодировки UTF-8, но даже всякий раз, когда я использую request.getParameter для всего, что имеет любые двухбайтовые символы, такие как длинное тире, они превращаются в битые символы.

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

Единственный раз, когда я обнаружил, что он возвращается как сломанные символы, - это когда я пытаюсь отобразить его в другом месте после получения с помощью request.getParameter.

У кого еще возникла эта проблема? Как я могу это исправить?


person Community    schedule 09.05.2012    source источник
comment
Клиент также отправляет на сервер данные в кодировке UTF-8?   -  person Romain    schedule 09.05.2012
comment
Я верю, что это так, но как я могу быть уверен?   -  person    schedule 09.05.2012


Ответы (4)


Это может произойти, если кодировка запроса и / или ответа вообще не установлена ​​должным образом.

Для запросов GET вам необходимо настроить его на уровне servletcontainer. Неясно, какой из них вы используете, но, например, Tomcat, который должен выполняться атрибутом URIEncoding в элементе <Connector> в его /conf/server.xml.

<Connector ... URIEncoding="UTF-8">

Для запросов POST вам необходимо создать фильтр, который сопоставлен с желаемым шаблоном URL, охватывающим все эти запросы POST. Например. *.jsp или даже /*. Выполните следующую работу в doFilter():

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

Для ответов HTML и кодирования на стороне клиента представленных входных значений HTML-формы необходимо установить кодировку страницы JSP. Добавьте это в начало JSP (вы, вероятно, уже сделали это правильно, учитывая тот факт, что отображение прямой формы DB UTF-8 работает нормально).

<%@page pageEncoding="UTF-8" %>

Или, чтобы предотвратить копирование на каждый JSP, настройте его один раз в web.xml:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

Для файлов исходного кода и стандартного вывода (консоль IDE) необходимо установить кодировку рабочей области IDE. Неясно, какой из них вы используете, но, например, в Eclipse это можно сделать, установив для Window ›Preferences› General ›Workspace› Text File Encoding значение UTF-8.

введите описание изображения здесь

Обратите внимание, что теги HTML <meta http-equiv> игнорируются, когда страница обслуживается через HTTP. Учитывается только тогда, когда страница открывается из файловой системы локального диска через file://. Также указывать <form accept-charset> не нужно, поскольку по умолчанию уже используется кодировка ответа, используемая во время обслуживания HTML-страницы с формой. См. Также спецификацию HTML W3.

Смотрите также:

person BalusC    schedule 09.05.2012

Ответ BalusC правильный, но я просто хочу добавить, что важно (конечно, для метода POST), что

request.setCharacterEncoding("UTF-8");

вызывается до того, как вы прочитаете какой-либо параметр. Так реализован параметр чтения:

@Override
public String getParameter(String name) {
    if (!parametersParsed) {
        parseParameters();
    }
    return coyoteRequest.getParameters().getParameter(name);
}

Как видите, есть флаг parametersParsed, который устанавливается, когда вы читаете какой-либо параметр в первый раз, метод parseParameters () с синтаксическим анализом всех параметров запроса и установкой кодировки. Звонок:

request.setCharacterEncoding("UTF-8");

после того, как параметры были проанализированы, не будет иметь никакого эффекта! Вот почему некоторые люди жалуются, что установка кодировки запроса не работает. В большинстве ответов здесь предлагается использовать фильтр сервлетов и установить там кодировку символов. Это правильно, но также имейте в виду, что некоторые библиотеки безопасности могут читать параметры запроса до вашего фильтра (это был мой случай), поэтому, если ваш фильтр выполняется после этого, кодировка символов параметров запроса уже установлена, и установка UTF-8 или любого другого будет не имеют никакого эффекта.

person Tomasz Hadam    schedule 29.08.2016


Просто хочу добавить, что на случай, если кто-то совершит ту же ошибку, что и я, когда я пропустил метод POST

Прочтите все эти решения и примените их к моему коду, но они все равно не работают, потому что я забыл добавить method="POST" в свой тег <form>

person sicnarfmis    schedule 21.07.2017