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

14

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

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

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

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

Я верю, что это так, но как я могу быть уверен? user707053
Отправляет ли клиент также кодированный в UTF-8 материал на сервер? Romain

Ваш Ответ

4   ответа
21

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

Для запросов 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 (вы, вероятно, уже сделали это должным образом, учитывая тот факт, что отображение прямой базы данных 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.

enter image description here

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

See also: Unicode - How to get the characters right? Why does POST not honor charset, but an AJAX request does? tomcat 6 HTML : Form does not send UTF-8 format inputs Unicode characters in servlet application are shown as question marks Bad UTF-8 encoding when writing to database (reading is OK)
-1

что в случае, если кто-то еще сделал ту же ошибку, что и я, где я пропустилPOST method

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

2

но я просто хочу добавить, что важно (конечно, для метода 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 или любой другой будет не имеют никакого эффекта.

2

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8 а такжеhttp://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q4

Тестовая JSP, приведенная в FAQ, по сути является той, которую я использовал, когда проходил через Tomcat несколько лет назад, чтобы исправить различные проблемы с кодировкой.

Похожие вопросы